Segmentation fault strlen(NULL)上的条件检查导致分段错误

Segmentation fault strlen(NULL)上的条件检查导致分段错误,segmentation-fault,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

我正在编写一个包含以下循环的函数。此段从包含多行文本的文本文件中读取,每行包含一个单词和\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
}
有问题的一行是:如果strlentPtr>0。如果tPtr为空,则该行导致seg。奇怪的是,调用strlentPtr不会给出seg错误


无论如何,我认为这不会是一个问题,因为sPtr在while循环的开始检查NULL情况。很明显,在strtoksPtr对sPtr进行操作之后,\r\n对于一些非NULL的sPtr,您将得到NULL。但我不明白这怎么会发生

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


如果找不到正在搜索的令牌,strtok也会返回一个NULL指针,这就是为什么在检查代码中的NULL之后,仍然会得到segfault

可能是的重复:它读取了一个空字符串,带有\n,当strtok返回空指针时。