[英]C function to swap two chars in a char[] segfaults, despite not working with string literals
我已在GDB中驗證程序在*(a)= *(b)行崩潰。 這對我來說沒有意義。
在我的main函數中,我為char *字符串分配了5個字節。 我傳遞兩個指向swap的指針,一個是sizeof(char)的字符串偏移量,另一個是指向string的指針。 這些指針被復制到swap()的調用堆棧。 我之前分配的5個字節仍然應該在堆棧上,因此swap()在解除引用和寫入堆棧上的那些位置時應該沒有問題,對吧?
int main(int argc, char* argv[])
{
char *string = "abcd";
swap((string+1), string);
printf("%s\n",string);
return 0;
}
void swap(char *a, char *b)
{
if(!a || !b)
return;
char temp = *(a);
*(a) = *(b);
*(b) = temp;
}
char *string = "abcd";
是指向字符串文字的指針,字符串文字在C中是不可變的。修改字符串文字會調用未定義的行為。
將string
的聲明更改為:
char string[] = "abcd";
修復你的程序。 這里string
是一個數組,用字符串文字的內容初始化並且是可修改的。
像"abcd"
這樣的字符串文字是只讀的,你不能改變它們。 采用
char string[] = "abcd";
代替。
你應該使用char string[] = "abcd";
,因為字符串在char* string= "abcd";
是不可改變的char* string= "abcd";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.