对strlen(NULL)的条件检查给出了分段错误

时间:2015-10-17 17:01:40

标签: segmentation-fault

我正在编写一个包含以下循环的函数。此段从包含多行文本的文本文件中读取,每行包含一个单词和\ r \ n个字符。

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,则该行导致seg。错误(奇怪地调用strlen(tPtr)不会产生seg错误)。

无论如何,我认为这不会是一个问题,因为在while循环开始时会为NULL-case检查sPtr。显然,在strtok(sPtr, "\r\n")对sPtr进行操作后,对于某些非NULL sPtr,您将获得NULL。但我不知道这是怎么发生的。

1 个答案:

答案 0 :(得分:0)

这是正常行为。访问NULL指针正式 undefined behvaior ,这意味着任何事情都可能发生。分段错误只是那些可能的未定义行为之一。

如果找不到您正在搜索的令牌,strtok也会返回NULL指针,这就是您在代码中检查NULL后继续获得段错误的原因。 See the documentation.