簡體   English   中英

以下 C 代碼輸出分段錯誤錯誤,我很難理解為什么

[英]The following C code outputs a segmentation fault error which I can hardly understand why

#include <stdio.h>

void append(char* s, char n);
void splitstr(char* string);

int main()
{
    splitstr("COMPUTE 1-1");
    printf("\n");
    splitstr("COMPUTE 1+1");
    printf("\n");
    splitstr("COMPUTE 1*1");
    return 0;
}

void append(char* s, char ch) {
    while(*s != '\0'){
        s = s + 1;
    }
    *s = ch;
    s = s + 1;
    *s = '\0';
}

void splitstr(char* string){
    int count = 1;
    char* expression = "";
    while(*string != '\0'){
        if(count > 8){
            append(expression, *string);
            string = string + 1;
            count = count + 1;
        }else{
            string = string + 1;
            count = count + 1;
        }
    }
    printf("%s",expression);
}

示例輸入和 Output:
輸入:計算 1+1
Output:1+1
輸入:計算 2-6
Output:2-6

最初,此代碼不包含 stdio.h(我這樣做是為了在在線 C 編譯器上進行測試),因為我正在從頭開始構建操作系統,所以我需要自己編寫所有函數。 我認為問題可能出在 append function 但我找不到它。

而不是char* expression = ""; char[MAX_expression_length+1] expression;

或在 append function 中使用 realloc

我認為這條線是罪魁禍首:

append(expression, *string);

注意expression是如何聲明的:

char* expression = "";

換句話說, expression由一個字節組成,一個單一的\0 馬上,我們可以看到append()不會像你希望的那樣工作while循環永遠不會運行,因為*s已經是\0了。

但除此之外,段錯誤可能發生在append()的底部。 在 while 循環之后,您無條件地遞增s ,然后寫入它現在指向的位置。 問題是這是一個從未分配過的位置(因為s是對splitstr()expression的引用,它是一個單字節長)。 此外,由於expression被聲明為字符串常量,根據您的平台,它可能放置在標記為只讀的 memory 區域中。 因此,這是嘗試寫入 memory 可能實際上不屬於該進程並且也可能不可寫,從而引發故障。

expression指向字符串文字,嘗試修改字符串文字會導致未定義的行為。

您需要將expression定義為一個足夠大的char數組來存儲您的最終結果:

char expression[strlen(string)+1]; // VLA

由於您的結果不會比源字符串長,這應該足夠了(假設您的實現支持 VLA)。

暫無
暫無

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

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