2015-10-17 150 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,那麼這條線會導致seg。故障(奇怪地呼叫strlen(tPtr)不會導致seg故障)。

無論如何,我認爲這不會是一個問題,因爲sPtr在NULL循環的開始處被檢查。顯然,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指針是正式的,這意味着任何事情都可能發生。分段錯誤只是這些可能的未定義行爲之一。

如果沒有找到您正在搜索的令牌,則也會返回一個空指針strtok,這就是您在代碼中檢查NULL後繼續得到段錯誤的原因。 See the documentation.