[英]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.