亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

str2 為什么不能修改??

? 1 #include <stdio.h>
? 2 #include <malloc.h>
? 3 int main()
? 4 {????? ?
? 5???????? char *str2;
? 6???????? printf("input the str2 value\n");
? 7???????? str2=(char *)malloc(sizeof(char)*10);
? 8???????? str2="world";
? 9???????? scanf("%s",str2);;
?10???????? printf("str2 is %s\n",str2);
?11???????? return 0;
?12 }????? ??????????

按照老師說的我這里已經用malloc為str2在棧內存里面分配了空間,為什么還是不能修改?。??

正在回答

2 回答

str2="world" 這樣并不是把world這幾個字符復制到str2所指的區域,字符串字面量做右值時會轉換為指向首字符的指針,所以這語句是把str2指向“world”這個字符串所在的位置。需要復制字符串應使用LS說的strcpy函數。

一般程序會把字符串字面量放到只讀數據段中(無法被修改),所以后續通過str2來修改這些內容會引起"段錯誤"。

你代碼的另一個問題是,在你給str2第二次賦值后就丟掉了前一次分配的指針,導致無法回收那段內存,引起內存泄漏。

1 回復 有任何疑惑可以回復我~
#1

King_J 提問者

嗯嗯,你說的是對的,用str2="world"對str2進行賦值時是將“world”的地址存到了str2中,這樣改變了上一次分配的指針,會引發上面分配的內存泄露。而我用上面scanf進行重新輸入時,程序認為我是在修改str2“world”,“world”是常量不能被修改,這這樣就導致了程序錯誤。謝謝
2015-09-04 回復 有任何疑惑可以回復我~

str2="world"賦值應該改成strcpy(str2,"world"),應為"world"存在代碼區不能進行修改,而用strcpy則是存在棧區。

1 回復 有任何疑惑可以回復我~
#1

onemoo

是這個意思,但表述得不太準確。 strcpy只是通過兩個指針來操作其中的字符,不管他們是在哪里。 你的str2所指的內存是在堆(heap)上(因為是malloc分配的)。還有就是別忘了在使用后釋放掉這段內存。
2015-09-04 回復 有任何疑惑可以回復我~
#2

King_J 提問者 回復 onemoo

嗯嗯,知道了。謝謝
2015-09-04 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

str2 為什么不能修改??

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號