以下c代码似乎在输入中最多占用8个字符,然后为较大的输入提供segFaults。
int main()
{
char a[1];
printf("Input:\n");
scanf("%s",a);
printf("%s\n",a);
printf("%d\n",strlen(a));
printf("%d\n",sizeof(a));
return 0;
}
输出
案例1:
Input:
aaaaaaaa
aaaaaaaa
8
1
案例2:
Input:
aaaaaaaaa
aaaaaaaaa
9
1
[1] 15688 segmentation fault (core dumped)
我的机器是64位Intel Linux
编译器为gcc version 6.1.1 20160802 (GCC)
执行的命令序列:
gcc -c -g test.c
- 创建输出文件test.o
gcc -o test test.o
./test
我是c编程的初学者。非常感谢任何见解。
从表面上看,我希望它能在输入2个或更多字符时给出一些错误或警告。
此外,objdump -d test
给出了sub $0x10,%rsp
,这意味着堆栈为main()存储了16个字节。所以也许它应该是16个字符,而不是8个输入。
答案 0 :(得分:3)
当您将数组声明为:
时char a[1];
它只能为一个表现良好的程序保留一个字符。如果将多个字符放入数组中,则程序将受到未定义的行为。根据定义,未定义时,您无法理解此类程序的行为方式。
不要这样做 理解这样一个程序的行为是毫无意义的。