在由教授給出了一些示例代碼: C:strncpy比分配的字符更多然後打印...意外的輸出?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf("%s\n", alpha);
printf("%c\n", alpha[8]);
alpha[8] = 'Z'; /* segmentation fault if alpha is declared statically! */
printf("%d\n", sizeof(alpha));
printf("%d\n", strlen(alpha));
char x[10];
strncpy(x, alpha, 26);
/* strncpy() will NOT copy or append a '\0' */
printf("%s\n", x);
return EXIT_SUCCESS;
}
當第一次編譯和運行,程序段錯誤是由於,從我在谷歌搜索,對緩衝區溢出gcc的一個保護機制(幾分鐘看到觸發
由printf("%s\n", x);
其中x已經被填充了來自alpha的26個字節)。這我相信我明白了。
但是,禁止用gcc -fno堆棧保護器的保護機制的時候,我看到的輸出是:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
I
27
26
ABCDEFGHZJKLMNOPQRSTUVWXYZKLMNOPQRSTUVWXYZ
我認爲,因爲strncpy會不空終止字符串,當打印X
它實際上可能會打印完整值alpha
- 但事實上,它的打印全部爲alpha
,然後更多alpha
!
有人可以提供一些見解嗎?
我希望有一個確定性的原因,'KLMNOPQRSTUVWXYZ'會在'ABCDEFGHZJKLMNOPQRSTUVWXYZ'之後直接打印出來;我想如果在Z之後出現空字符,K-Z秒輸出將不會顯示。 – Joseph 2012-03-08 06:00:30
您僅複製26個字符,因此可能在alpha中的'Z'後面出現的空字符不會被複制。但是,一個數組越界也不能保證,因爲對於x只分配了10個字節,x的第10個字節後的內存不屬於你,並且可以在任何方向操作 – Jay 2012-03-08 06:04:58
好點,謝謝! – Joseph 2012-03-08 06:10:01