将标记指针(从strtok)分配到结构体的{2} VLA的指针元素时的Segfault

时间:2015-07-06 19:41:17

标签: c arrays pointers variable-length-array

我正在尝试解析csv文件并将这些值存储在2d VLA中。 第一个代码块显示了我对函数TokenizeLine的两个调用,它非常简单地使用strtok将行拆开并将令牌分配给数组中的相应单元。第二个块是有问题的功能。

  //Get first line of file then iterate through lines until
  //beginning comments are passed over
  fgets(currentLineStr, 8192, fileIn); 
  while (currentLineStr[0] == '#')
        fgets(currentLineStr, 8192, fileIn);

  //Start adding values to array. current line held by currentLineStr
  //is assigned first
  TokenizeLine(currentLineStr, eTable, yIndex, x, y);

  yIndex++;
  while(fgets(currentLineStr, 8192, fileIn) != NULL)
  {
        TokenizeLine(currentLineStr, eTable, yIndex, x, y);
        yIndex++;
  }

在以下函数中,我将令牌指针分配给eTable结构中包含的指针时会出现段错误。

void TokenizeLine(int x; int y; char currentLineStr[], Entry eTable[x][y], int yIndex, int x, int y)
{
  char *tokPtr;
  int xIndex = 0;

  tokPtr = strtok(currentLineStr, "|");
 *** eTable[xIndex][yIndex].str = tokPtr;*** (error happening here)

  while(tokPtr != NULL)
  {
        tokPtr = strtok(NULL, "|");
        eTable[xIndex][yIndex].str = tokPtr;
        //printf("%s\n", eTable[xIndex][yIndex].str);      

        xIndex++;
  } 
}

一直坚持这一点任何/所有输入赞赏和鼓励。

1 个答案:

答案 0 :(得分:1)

您未检查第一次strtok()来电的返回值。

此外,在while循环中,检查tokPtr是否为NULL,但在使用之前在循环体的第一行更新它。

您需要删除eTable[xIndex][yIndex].str的初始设置,并将第二个strtok()调用移至while循环的末尾:

  tokPtr = strtok(currentLineStr, "|");

  while(tokPtr != NULL)
  {
        eTable[xIndex][yIndex].str = tokPtr;
        //printf("%s\n", eTable[xIndex][yIndex].str);      

        tokPtr = strtok(NULL, "|");
        xIndex++;
  }