【问题标题】:Segmentation fault when using fgets()使用 fgets() 时出现分段错误
【发布时间】:2016-01-15 21:30:14
【问题描述】:

我正在尝试将句子列表存储在二维指针数组中。下面的代码在循环被评估后给出了一个分段错误(我用 printf 语句检查;循环内没有执行任何语句):

int main( int argc, char** argv){

  char *inputarray[MAX_LINE];
  int count = 0;

  //char cpy[MAX_LENGTH] <---- This one doesn't work either                                                                                                                                                                                                                                                    
  char *cpy = (char*) calloc (MAX_LENGTH, sizeof(char));

  while ( count <= MAX_LINE && fgets(cpy, MAX_LENGTH, stdin)){

    int str_len = strlen(cpy);
    cpy[--str_len] = '\0';

    inputarray[count++] = reverse(cpy, str_len);

  }

  printOutput(inputarray, count);

  return 0;

}

现在已经尝试调试 3 个多小时,但无济于事。帮助任何人?

【问题讨论】:

  • 什么是 MAX_LENGTH?你在给这个喂什么?你能显示输入的前 MAX_LENGTH + 1 个字符吗?
  • 你能展示一下反向函数在做什么吗?其他几点注意事项:1)不要强制返回 calloc(使用 c 时)。它可以掩盖重要的警告并且不需要 2) fgets 将终止字符串,但看起来您正在截断输入的最后一个字符,这是故意的吗?
  • 是的,摆脱\n

标签: c pointers segmentation-fault fgets


【解决方案1】:

您仅将MAX_LINE 元素分配给指向该字符的指针数组。

  • 因为数组索引从0开始。
  • 使用条件 (count &lt; MAX_LINE) 而不是 (count &lt;= MAX_LINE)

示例: 假设你分配了*inputaray[5]; 这就是发生的事情,

count=0;    //1st sentence 
count=1;    //2nd sentence
count=2;    //3rd sentence
count=3;    //4th sentence
count=4;    //5th sentence

在上面的代码中,

 count=5;   //which is <=5 

因此尝试将输入字符串存储到无效内存中。

【讨论】:

  • 我觉得我的回答是对的。但我是 Stackoverflow 回答的新手。
  • 好的,继续。但我的回答 +1。
  • 自己修改一下 inputarray 不是 char array 。他声明的是array of pointer to char
  • @ameyCU 非常感谢。
  • 不是 pointers to char array 只是 array of pointers to char 。两者有不同的含义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2022-01-14
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多