2017-01-04 100 views
0

如果我設置一個數組變量a [] =「abc」,然後設置另一個數組變量b [] = {'d','e','f'},我最後的輸出代碼是printf (「%s」,b),它的輸出值是「defabc」,爲什麼?我的輸出是數組b,但輸出值將首先輸出數組b,然後輸出數組一秒鐘。整個代碼在下面。數組輸出

#include<stdio.h> 
void main(){ 
    char a[]="abc"; 
    char b[]={'d','e','f'}; 
    printf("%s",b); 
} 

輸出是「defabc」。 而數組b的字符串長度是7爲什麼?

+0

我沒有看到 「defabc」 作爲輸出。 –

+1

您在b中沒有空終止符,所以函數會讀取過去的緩衝區,並且發生下一個棧是 –

+1

@AdityaK這是程序員做錯事情時_undefined_行爲的快樂。 ;) –

回答

0

兩個字符串的末尾都需要一個空終止符。你的第二個字符串沒有定義爲字符數組。

+0

OK thx for your help。 – Pulsar

3

在C中的所有字符串爲空(即\0)終止,所以你的第二個變量應如下所示:

char b[] = {'d', 'e', 'f', '\0'}; 

爲什麼"defabc"印有你的代碼你可能會好奇。答案是,所有局部變量都存儲在stack-based memory layout中。所以,你的內存佈局是這樣的:

|'d' | <-- b 
|'e' | 
|'f' | 
|'a' | <-- a 
|'b' | 
|'c' | 
|'\0'| 

還要注意的是printf("%s", ...)讀取,直到它達到\0,使printf("%s", a)按預期工作,但printf("%s", b)打印"defabc"

+0

哦,我明白thx。 – Pulsar

+0

我不會提到堆棧數據結構,但[內存組織](https://en.m.wikipedia.org/wiki/Stack-based_memory_allocation)。數據結構在這裏不相關 –

+0

@OlegBogdanov你說得對「數據結構」是出於不同的目的! –

0

正確的方式來聲明一個String

char b[] = { 'd', 'e', 'f', '\0' }; // null terminator required 

char b[] = "def"; // null terminator added automatically 

所以,這段代碼將打印def作爲輸出

#include <stdio.h> 

int main() { 
    char a[] = "abc"; 
    char b[] = { 'd', 'e', 'f', '\0' }; 
    printf("%s", b); 
    return 0; 
} 
+0

好的,我明白.thx – Pulsar