一个字节 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];

对于运行良好的程序,它只能容纳一个字符。如果将多个字符放入数组中,则程序会出现未定义的行为。当这种程序的行为根据定义未定义时,您无法理解它的行为方式。

不要这样做。
理解这样一个程序的行为是没有意义的。