为什么此代码中会出现“分段错误”?

时间:2021-02-25 13:46:17

标签: c segmentation-fault

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

退出,分段错误

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

2 个答案:

答案 0 :(得分:2)

您通过写入超出范围的 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;
}

答案 1 :(得分:2)

您定义 str 的方式:

char str[] = "";

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

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

char str[100];

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

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