一个字节的char数组似乎存储了8个输入字符串字符

时间:2016-09-08 05:40:36

标签: c gcc sizeof

以下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个输入。

1 个答案:

答案 0 :(得分:3)

当您将数组声明为:

char a[1];

它只能为一个表现良好的程序保留一个字符。如果将多个字符放入数组中,则程序将受到未定义的行为。根据定义,未定义时,您无法理解此类程序的行为方式。

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