Segmentation fault strlen(NULL)上的条件检查导致分段错误
我正在编写一个包含以下循环的函数。此段从包含多行文本的文本文件中读取,每行包含一个单词和\r\n字符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
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返回空指针时。