一个字节 char 数组似乎存储 8 个输入字符串字符
One byte char array appears to store 8 input string characters
以下一段 c 代码似乎在输入中最多占用 8 个字符,然后为更大的输入提供段错误。
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
案例二:
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 [=18=]x10,%rsp
,这意味着堆栈为 main() 存储了 16 个字节。所以也许应该输入 16 个字符而不是 8 个字符。
当您将数组声明为:
char a[1];
对于运行良好的程序,它只能容纳一个字符。如果将多个字符放入数组中,则程序会出现未定义的行为。当这种程序的行为根据定义未定义时,您无法理解它的行为方式。
不要这样做。
理解这样一个程序的行为是没有意义的。
以下一段 c 代码似乎在输入中最多占用 8 个字符,然后为更大的输入提供段错误。
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
案例二:
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 [=18=]x10,%rsp
,这意味着堆栈为 main() 存储了 16 个字节。所以也许应该输入 16 个字符而不是 8 个字符。
当您将数组声明为:
char a[1];
对于运行良好的程序,它只能容纳一个字符。如果将多个字符放入数组中,则程序会出现未定义的行为。当这种程序的行为根据定义未定义时,您无法理解它的行为方式。
不要这样做。
理解这样一个程序的行为是没有意义的。