在教授给出的一些示例代码中:
#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-stack-protector 禁用保护机制时,我看到的输出是:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
I
27
26
ABCDEFGHZJKLMNOPQRSTUVWXYZKLMNOPQRSTUVWXYZ
我认为由于 strncpy 不会终止字符串,因此在X
打印时它实际上可能会打印alpha
- 但实际上,它正在打印所有的alpha
,然后还有更多alpha
!
有人可以在这里提供一些见解吗?