【问题标题】:Why does a 'segmentation fault' occur in this code?为什么此代码中会出现“分段错误”?
【发布时间】:2021-02-25 13:46:17
【问题描述】:
void loop(char * a){
  for(int i=0;i<10;i++){
    printf("%s\n", a);
  }
}

int main(){
  char str[] = "";

  printf("input:");
  scanf("%[^\n]s", str);

  loop(str);

  return 0;
}

输入短字符串没有问题, 但问题是当我输入更长的字符串时。

例如,

输入:abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

abcdefghijkl

输入:

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

abcdefghijklm

已退出,分段错误

为什么会出现这个错误? 这和缓冲区溢出有关吗?

【问题讨论】:

  • str 是一个大小为 0 的数组。
  • 我认为有一个错字,你的循环函数没有被调用..
  • @Damien 大小为 1(仅包含终止空字符)
  • 还值得一提的是哪些是分段错误的根本原因。它可以帮助了解哪个内存区域触发了故障。 stackoverflow.com/questions/2346806/…
  • @MarcoFrau 感谢您的建议!下次我会处理那部分。

标签: c segmentation-fault


【解决方案1】:

您通过写入超出范围的单元素数组str 调用了未定义的行为,允许任何事情发生。

分配足够的缓冲区并限制读取的最大长度以避免缓冲区溢出。

int main(){
  char str[102400] = ""; /* allocate enough size */

  printf("input:");
  scanf("%102399[^\n]s", str); /* limit the length to read (the size of buffer minus one for terminating null-charater) */

  return 0;
}

【讨论】:

  • 告诉新手在堆栈上分配 102400 字节并不是很好的建议,但是...您可能希望将其编辑为较小的大小。
【解决方案2】:

你定义str的方式:

char str[] = "";

它足够大,可以包含一个长度为零的字符串,即它是一个长度为 1 的数组。因此,您尝试写入的任何较大的字符串都会超出缓冲区,从而触发 undefined behavior

你应该给你的缓冲区一个足够大的大小来接受你期望的字符串大小。

char str[100];

并更新scanf 调用以限制字符数:

scanf("%99[^\n]s", str);

【讨论】:

猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2020-12-15
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多