Segfault при назначении указателя токена (из strtok) элементу указателя 2d VLA структур

Я пытаюсь разобрать файл 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++;
  }

В следующей функции я получаю segfault при назначении указателя токена указателю, содержащемуся в структуре 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++;
  } 
}

Застрял на этом какое-то время, любой / весь вклад ценится и поощряется.


person J2R5M3    schedule 06.07.2015    source источник
comment
Что такое Entry? Как определяется eTable? Я надеюсь, вы знаете, что strtok использует статическую переменную внутри, поэтому каждый раз, когда вы вызываете strtok, предыдущее возвращаемое значение исчезает.   -  person Koshinae    schedule 06.07.2015
comment
@Koshinae Я знаю о статической переменной, используемой в strtok, но спасибо за внимание.   -  person J2R5M3    schedule 06.07.2015
comment
Для начала скомпилируйте его с отладочными символами и пропустите через отладчик. Затем вы можете проверить, на что он ссылается, что вызывает срабатывание sigsegv.   -  person Koshinae    schedule 06.07.2015


Ответы (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++;
  } 
person dbush    schedule 06.07.2015
comment
Я проверил предложенные вами изменения, но все еще получаю segfault при первом (теперь только) назначении tokPtr на eTable[xIndex][yIndex].str. оцените любое общее направление, в котором вы могли бы меня направить с точки зрения сосредоточения внимания на проблеме. - person J2R5M3; 06.07.2015
comment
Здесь происходит больше, чем мы можем видеть из того, что вы опубликовали. Опубликуйте в своем вопросе минимальный, полный и проверяемый пример. - person dbush; 06.07.2015
comment
Извините, если я не опубликовал достаточно контекста, я не хотел просто публиковать кучу кода и заставлять любого, кто хотел помочь, пробираться через все это, чтобы найти материал. Что-нибудь особенное, что я мог бы опубликовать, что, по вашему мнению, может быть полезным, или я должен публиковать все? - person J2R5M3; 06.07.2015
comment
Начните с того, что у вас есть, и уменьшите его настолько, насколько это возможно, сохраняя при этом состояние ошибки. Тогда опубликуйте это. - person dbush; 06.07.2015
comment
так что я так и не понял, что именно пошло не так, он просто волшебным образом снова начал работать, пока я соединял вещи, как вы предложили. Так что спасибо за это. - person J2R5M3; 07.07.2015