将令牌指针(来自 strtok)分配给结构的 2d VLA 的指针元素时出现段错误

Segfault when assigning token pointer (from strtok) to pointer element of 2d VLA of structs

我正在尝试解析 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++;
  } 
}

在此问题上停留了一段时间any/all 对输入表示赞赏和鼓励。

您没有检查第一个 strtok() 调用的 return 值。

此外,在您的 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++;
  }