【问题标题】:One byte char array appears to store 8 input string characters [duplicate]一字节字符数组似乎存储 8 个输入字符串字符 [重复]
【发布时间】:2016-09-08 05:40:35
【问题描述】:

以下 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;
}

输出

案例一:

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 个字符。

【问题讨论】:

  • 您希望发生什么?
  • 这是未定义的行为。什么事情都可能发生。在您的情况下,您将覆盖 main 堆栈框架边界。
  • @Amit 我预计输入 2 个或更多字符时会出现 segFault,因为每个字符输入的大小应为 1 个字节
  • 很多事情都会导致未定义的行为。
  • 如果您可以确定地预测 UB 代码的结果,那它就不会是 UB。既然你知道这是UB,这个问题就没有意义了。

标签: c gcc sizeof


【解决方案1】:

当你有一个数组声明为:

char a[1];

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

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

【讨论】:

  • 应该删除问题吗?
  • 不,没必要。这是学习语言的一部分——创建错误代码并找出为什么它的行为不像你期望的那样。
  • @stWrong 系统会在半小时左右后自动删除负分和重复链接的问题。不要个人认为,这只是意味着该网站已经有此信息,因此不需要重复。
  • @M.M - 你是sure吗?你的说法有证据吗?
  • @Amit 这个政策是在 2008 年以后才开始的。在 meta 上寻找讨论。
猜你喜欢
  • 2020-02-14
  • 2018-05-01
  • 2016-04-30
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多