2015-08-13 44 views
-3

我在C程序中追查了一個問題,致電strtok()(其簽名爲char *strtok(char *str, const char *delim))。在試圖用一個非常簡單的玩具程序重新創建問題時,我碰到了一堵牆 - 我每次嘗試運行代碼時都會傳遞所有正確的參數類型併發生總線錯誤。爲什麼使用正確的參數類型調用此strtok()失敗?

這裏的程序:

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    char* tok; 
    char* str = "www.example.com"; 
    const char* split = "."; 

    tok = strtok(str, split); 
    while(tok != NULL) { 
     printf("%s\n", tok); 
     tok = strtok(NULL, split); 
    } 
} 

奇怪的是,我發現,宣佈str爲數組(char str[] = "www.example.com"),並傳遞一個參考str初始的strtok調用(tok = strtok(&str, split))似乎正常工作。

我真的不擔心這裏的功能 - 使用數組的解決方案的作品。我很好奇爲什麼使用指向char的指針的原始實現失敗並拋出一個總線錯誤。

+0

http://stackoverflow.com/questions/2589949/c-string-literals-where-do-they-go – fukanchik

回答

2

char* str = "www.example.com"; 
/// some code 
tok = strtok(str, split); 

情況下,您使用的是(指針)字符串字面作爲第一個參數。由於strtok()可能會嘗試更改傳遞給它的第一個參數的內容,因此您將面臨undefined behaviour

man page

報價在使用這些功能時一定要小心。如果你確實使用它們,請注意:

這些函數修改它們的第一個參數。 [...]

和關於試圖改變到一個字符串,從C11,章§6.4.5

[...]如果程序試圖修改這樣的陣列,該行爲是不確定的

OTOH,如果您創建一個數組,字符串常量初始化和數組傳遞給strtok(),這是完全正常的,因爲你的陣列是由您的程序修改。

+0

downvote的原因是什麼? –

相關問題