2015-10-17 2 views
0

Я пишу функцию, которая содержит следующий цикл. Этот сегмент читается из текстового файла, который содержит несколько строк текста, каждый из которых содержит одно слово и символы \ r \ n.Условная проверка на strlen (NULL) дает ошибку сегментации

int strSize = 100; 
char* sPtr = (char*)malloc(strSize*sizeof(char)); 
char* tPtr = (char*)malloc(strSize*sizeof(char)); 
FILE* fp = fopen("someTextFile.txt","r"); 

fgets(sPtr, strSize, fp); //Read in first line 

while(sPtr != NULL) { 
    tPtr = strtok(sPtr, "\r\n"); //There's one word per line, which terminates with \r\n 
    if(strlen(tPtr) > 0) 
    { 
    ... Do stuff 
    } 
    sPtr = fgets(sPtr, strSize, fp); //Read next line, if fgets() reaches EOF, then sPtr <= NULL 
} 

Проблемная линия: if(strlen(tPtr) > 0). Если tPtr равно NULL, тогда эта строка вызывает сегмент. ошибка (странное обращение strlen(tPtr) не дает ошибки seg).

В любом случае, я думал, что это не будет проблемой, поскольку sPtr получает проверку в начале цикла while для NULL-case. Итак, очевидно, что после того, как strtok(sPtr, "\r\n") работает на sPtr, для некоторого не-NULL sPtr вы получите NULL. Но я не понимаю, как это может произойти.

+0

Возможный дубликат [Окончательный список распространенных причин для сегментации отказам] (http://stackoverflow.com/questions/33047452/definitive-list-of-common-reasons-for-segmentation-faults) – CodeMouse92

+0

Фигурные его : он читает пустую строку с \ n, которая, когда strtok() возвращает нулевой указатель. –

ответ

0

Это нормальное поведение. Доступ к указателю NULL официально undefined behvaior, что означает, что что угодно и все может случиться. Ошибка сегментации - это одно из возможных неопределенных поведений.

Указатель NULL также возвращается strtok, если токен, который вы ищете, не найден, поэтому вы продолжаете получать segfault после проверки NULL в коде. See the documentation.

Смежные вопросы