在由教授给出了一些示例代码: 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