尝试将stdin读取到2d动态分配的数组时出现分段错误

时间:2017-02-01 21:39:44

标签: c arrays segmentation-fault dynamic-memory-allocation realloc

我正在尝试从stdin读取动态字符串数组,使用空格作为分隔符。代码如下

#include<stdio.h>
#include<stdlib.h>
char** parseInput(size_t *numElements)
{
  char **lines;
  int outerIndex = 0;
  int innerIndex = 0;
  int widths = 1;
  char c=getchar();
  lines =(char**) malloc((outerIndex+1)*sizeof(char*));
  lines[0] = (char*) malloc(sizeof(char));
  while(c!=EOF)
  {
    if(innerIndex==widths)//reallocate each strings length, double it
    {
      widths+=widths;
      int i;
      for(i=0;i<outerIndex+1;i++)
        lines[i]=(char*)realloc(lines[i],(widths+1)*sizeof(char));
    }
    lines[outerIndex][innerIndex]=c;
    innerIndex++;
    if(c==' ')//allocate memory for the next string in the array of strings
    {
      lines[outerIndex][innerIndex]='\0';
      innerIndex=0;
      outerIndex++;
      lines =(char**) realloc(lines,(outerIndex+1)*sizeof(char*));
      lines[outerIndex] = (char*) realloc(lines[outerIndex],(widths+1)*sizeof(char));
      //the above line in the debugger causes a segfault when outerIndex=19
    }
    c=getchar();
  }
  if(innerIndex!=0)//if the last character is not a space, append a space
  {
    if(innerIndex==widths)
    {
      widths+=widths;
      int i;
      for(i=0;i<outerIndex+1;i++)
        lines[i]=(char*)realloc(lines[i],(widths+1)*sizeof(char));
    }
    lines[outerIndex][innerIndex]=' ';
    lines[outerIndex][innerIndex+1]='\0';
  }
  *numElements=(size_t)(outerIndex+1);
  return lines;
}
int main()
{
    size_t num =0;
    char** lines = parseInput(&num);
}

当外部数组大小增加到超过20个变量时,我在指示的行处出现分段错误。例如,以下输入会导致段错误

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

但以下不是

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

调试错误说

Program received signal SIGSEGV, Segmentation fault.
0x0000003417e7bf4d in realloc () from /lib64/libc.so.6

这可能是由什么造成的?

1 个答案:

答案 0 :(得分:1)

在这一行:

lines[outerIndex] = (char*) realloc(lines[outerIndex], (widths+1)*sizeof(char));

你提供一个未初始化的指针作为realloc的第一个参数。你应该在这里使用malloc

其他问题:

  • char c应为int c(请阅读getchar的文档以了解原因。)
  • 如果输入以空格开头,则lines[outerIndex][innerIndex]='\0'写出越界。
  • 代码块开始if(innerIndex==widths)在代码中重复两次;最好是将它作为一个函数,或重构你的代码,这样就不会有这种重复。
  • 您可以通过删除冗余强制转型和sizeof(char)的冗余乘法(1来简化malloc / realloc调用。
  • 您应该检查malloc / realloc是否失败并采取相应行动。