2016-11-05 102 views
-1

將字符串複製到結構體並僅打印一個屬性時,會打印結構體的兩個成員。爲什麼會發生這種情況以及如何克服這一點?結構體中的字符數組成員 - 將值複製到兩個成員

typedef struct { 

    char a1[14]; 
    char a2[2]; 

} X; 


void main() { 

    X x; 

    strcpy(x.a1, "55555555555555"); 
    printf("A1 - %s\n\n", x.a1); 

    strcpy(x.a2, "D5"); 
    printf("A1 - %s\n\n", x.a1); 
    printf("A2 - %s\n\n", x.a2); 

} 

輸出:

A1 - 55555555555555 

A1 - 55555555555555D5 

A2 - D5 

爲什麼D5追加到A1在這裏?

回答

2

該數組太小,您需要N個字符+1作爲N字符的字符串。

它是嚴格未定義的行爲,但觀察到的行爲可以歸因於對struct存儲分配連續因此您打印「大串」由兩個數組組成的事實。

但是這種假設也是錯誤的,因爲「大串」缺乏'\0'終止,因爲你已經使用了陣列中所有可能的元素和複製的非'\0'字放進去。

所以你的程序的實際結果應該被認爲是不可預知的,你所觀察到的行爲實際上是未定義的行爲

+0

確定在年底給人一種空間\0字符,試了一下,現在的工作。所以,它的所有成員串行結構分配的內存?並且由於沒有空值,讀取A1時會附加輸出嗎?我對嗎 ? – user691197

+0

@ user691197不完全。我已經更新了答案,解釋了爲什麼這是輸出。但這是嚴格無法解釋的,因爲它是未定義的行爲。 –

+0

http://cboard.cprogramming.com/c-programming/89920-structs-sequential-memory.html可能會有所幫助@ user691197 – Cherubim

1

注:字符串是不是隻是一個字符數組,而是一個字符數組nul字符\0

這裏有終止:

char a1[14]; 
char a2[2]; 

你它們初始化

5555... 14 times 
D5 

這裏你沒有\0字符來標記字符串末尾,所以當你試圖打印字符數組時,結果是未定義的行爲

嘗試每個字符數組

char a1[15]; //extra space for the null terminating character 
char a2[3]; //similarly here