回覆列表
-
1 # 使用者7614415515023
-
2 # 使用者928021938244
由於free和malloc配對使用,malloc的時候,大小已經告訴系統了。
free的時候,系統會比對一下這個地址,是不是malloc申請的,如果不是,不給釋放
如果是的話,系統就知道要釋放多大記憶體,因為malloc的時候,系統有記錄的。
當然了,申請的地址,也記錄了的,否則,就無法比對了。
#include
#include
int main()
{
int *p;
p=(int *)malloc(sizeof(int)*3);
p[0]=1;p[1]=2;p[2]=3;
p++;
//free(p);/////////由於p++過,已經不是malloc申請的那個地址了,因此這句執行會報錯
p[0]=4;
free(p-1);//這句倒是正確的,因為經過p++,這裡的p-1剛好是malloc申請的地址
return 0;
}
另外,問你一個同樣的問題:
char *p1 = new char[10];
char *p2 = new char[20];
delete p1[];
delete p2[];
釋放p1和p2的時候,沒有指明大小,它怎麼知道p1是10,p2是20的呢?
如果不知道,它怎麼去爭取的釋放它們呢?
動態申請記憶體,然後像操作普通的指標一樣就可以了,只是記得要釋放。這個問題的難點在哪裡?是分配記憶體,還是輸入的時候字串有空格,或者,是最後的字串輸出?丟點程式碼吧,不知道是否符合你的要求,注意這個程式碼只是演示用,安全性等方面暫時忽略。
上圖(假裝是P的):字串儲存到變數裡面之後,要如何操作就看實際需要了。gets從stdin中讀入一行內容到指定的buffer中,當遇到換行符或EOF時讀取結束。讀取成功時,返回buffer首地址;失敗時返回null。需要注意的是,gets會將行末尾的"\n"字元或EOF替換成"\0",因此gets讀取的內容中不包括"\n"字元。