2014-10-01 79 views
0
#include "stdio.h" 

void main() 
{ 
    char firstName[1] = "1"; 
    char middleName[1] = "1"; 
    char lastName[1] = "1"; 

    printf("%p\t%s\n",firstName,firstName); 
    printf("%p\t%s\n",middleName,middleName); 
    printf("%p\t%s\n",lastName,lastName); 
} 

我編譯此代碼使用GCC 4.8.2,什麼是困惑我就是爲什麼它打印:印刷三個字符串內容相同的給出不同的結果

> 根@ Ubuntu的:〜#。 /主

0x7fff7124273d 111 
0x7fff7124273e 11 
0x7fff7124273f 1 

我認爲它應該打印:

0x7fff7124273d 1 
0x7fff7124273e 1 
0x7fff7124273f 1 

你能幫我嗎?

+0

爲char數組分配2個字節而不是1個。您總是必須爲'\ 0'字符串終止符保留1個附加字符。 – SomethingSomething 2014-10-01 11:05:23

+0

請記住,字符串應該以''\ 0''結尾。 – Maroun 2014-10-01 11:05:24

+0

您的陣列中沒有足夠的空間用於將'\ 0' – 2014-10-01 11:05:36

回答

4

由於數組的大小爲1,因此您正在分配長度爲2的數組(字符串文字在末尾還有空字符\0)。因此,指針指向的字符串可能不是NULL結尾的字符串。你需要的大小的數組2.

char firstName[2] = "1"; 
char middleName[2] = "1"; 
char lastName[2] = "1"; 

char firstName[] = "1"; 
char middleName[] = "1"; 
char lastName[] = "1"; 

另外,不要在C.使用int main使用void main

5
char firstName[1] = "1"; 

是合法的初始化char陣列這樣的,但它不是一個字符串,因爲它不是空終止。

"%s" in printf需要一個字符串,所以你在做什麼是未定義的行爲。


我的猜測是,編譯器把變量在一起,併發生後他們什麼字節是0,可以解釋發生了什麼。但是,這又是一個未定義的行爲,任何事情都可能發生。

 '1'  '1'  '1'  0 
    ^  ^ ^
firstName  |  | 
     middleName | 
        lastName 
1

"1"實際上是大小兩個字節 - '1', '\0' - 你忘記了C字符串是空終止的。空字節正在被初始化丟棄。您的數組需要足夠大以包含初始化程序中的所有數據以避免這種情況。

1

記住,C風格的字符串空值終止陣列,這意味着要在字符串後'\0'。注意事項,可以幫助你:

  • char firstName[2] = "1"; - 自行添加'\0',注意的2而不是1
  • char firstName[] = {'1'} - 難道添加'\0'
  • char firstName[2] = {'1'} - 增加'\0'

你得到這個輸出,因爲可能是字符放在一起,這是未定義的行爲。

+1

第二和第三個例子是完全一樣的。 – mch 2014-10-01 11:08:40

+0

@mch謝謝,修復。 – Maroun 2014-10-01 11:09:08

1

在代碼

printf("%p\t%s\n",firstName,firstName); 

得到印刷的第一件事情是該陣列的firstName的基地址,

第二件實際上是未定義的行爲。對於任何字符數組而言,它必須在末尾具有空字符\0。你的數組只有1個字符長,並且包含'1'。所以你沒有使用%s來打印。

代替%的使用%C打印的字符,如\

printf("%p\t%c\n",firstName,firstName); 
0

在C中,字符串是NUL封端,即字符串 「1」 是字符{ '1',0} 。你沒有給終結者留出足夠的空間,所以你的字符串被截斷,printf不知道它們在哪裏結束。

倒不如將其定義爲

char firstName[2] = "1"; 

和最好做

char firstName[] = "1"; 

所以編譯器爲您計算的內存適量如果你曾經處理一些與名字長於1個字符。

+0

固定的拼寫錯誤。你確定'\ 0'!=(char)0嗎? – 2014-10-01 11:48:11

+0

哦。你的權利 。這是正確的。 ' '\ 0' == 0' – 2014-10-01 11:52:06

相關問題