簡體   English   中英

strcmp出現分段錯誤,但是使用printf打印字符串

[英]Segmentation fault with strcmp, but the string prints using printf

我有一個返回char**的tokenizer方法。 結果存儲在名為lineTokenschar** 當我使用printf()打印第一個標記時,我得到了正確的結果,但是當我使用strcmp(lineTokens[0],"Some text") ,出現了段錯誤。 相應的代碼如下。

lineTokens = tokenize(tempString);
printf("token[0] = %s\n", lineTokens[0]);
if(strcmp(lineTokens[0], "INPUTVAR")==0){
    printf("It worked\n");
}

編輯:我的標記化代碼如下

char** tokenize(char* input){
int i = 0;
char* tok;
char** ret;
tok = strtok(input, " ");
ret[0] = tok;
while(tok != NULL){
    printf("%s\n", tok);
    ret[i] = tok;
    tok = strtok(NULL, " ");
    i++;
}
ret[i] = NULL;
return ret;

}

當然,如果沒有看到tokenize()的代碼,就不可能回答這個問題。

我的猜測是該函數中存在一些未定義的行為,這可能會破壞堆棧,因此當printf()運行並實際使用更多的堆棧空間時,情況就會變糟。 行為不確定的是,它實際上是不確定的,任何事情都可能發生。

在Valgrind中運行代碼。

您的標記化功能已損壞。 代碼中的每個指針都必須指向分配的內存,在這里情況並非如此。 您僅通過聲明一個指針就不會分配任何內存:指針僅包含指向分配給其他位置的內存的地址 假定您將其設置為指向“其他地方”,否則,它將指向隨機的垃圾地址。

因此,您需要從頭開始重寫該功能。 可以將指向已分配內存的指針作為參數傳遞,也可以在函數內部動態分配內存。 但是在您這樣做之前,我強烈建議您進一步研究數組和指針,例如通過閱讀C FAQ的這一章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM