第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

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 }????? ??????????

按照老師說(shuō)的我這里已經(jīng)用malloc為str2在棧內(nèi)存里面分配了空間,為什么還是不能修改????

正在回答

2 回答

str2="world" 這樣并不是把world這幾個(gè)字符復(fù)制到str2所指的區(qū)域,字符串字面量做右值時(shí)會(huì)轉(zhuǎn)換為指向首字符的指針,所以這語(yǔ)句是把str2指向“world”這個(gè)字符串所在的位置。需要復(fù)制字符串應(yīng)使用LS說(shuō)的strcpy函數(shù)。

一般程序會(huì)把字符串字面量放到只讀數(shù)據(jù)段中(無(wú)法被修改),所以后續(xù)通過(guò)str2來(lái)修改這些內(nèi)容會(huì)引起"段錯(cuò)誤"。

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

1 回復(fù) 有任何疑惑可以回復(fù)我~
#1

King_J 提問(wèn)者

嗯嗯,你說(shuō)的是對(duì)的,用str2="world"對(duì)str2進(jìn)行賦值時(shí)是將“world”的地址存到了str2中,這樣改變了上一次分配的指針,會(huì)引發(fā)上面分配的內(nèi)存泄露。而我用上面scanf進(jìn)行重新輸入時(shí),程序認(rèn)為我是在修改str2“world”,“world”是常量不能被修改,這這樣就導(dǎo)致了程序錯(cuò)誤。謝謝
2015-09-04 回復(fù) 有任何疑惑可以回復(fù)我~

str2="world"賦值應(yīng)該改成strcpy(str2,"world"),應(yīng)為"world"存在代碼區(qū)不能進(jìn)行修改,而用strcpy則是存在棧區(qū)。

1 回復(fù) 有任何疑惑可以回復(fù)我~
#1

onemoo

是這個(gè)意思,但表述得不太準(zhǔn)確。 strcpy只是通過(guò)兩個(gè)指針來(lái)操作其中的字符,不管他們是在哪里。 你的str2所指的內(nèi)存是在堆(heap)上(因?yàn)槭莔alloc分配的)。還有就是別忘了在使用后釋放掉這段內(nèi)存。
2015-09-04 回復(fù) 有任何疑惑可以回復(fù)我~
#2

King_J 提問(wèn)者 回復(fù) onemoo

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

舉報(bào)

0/150
提交
取消

str2 為什么不能修改??

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)