關於realloc()函數想到的
下面這段程序來自http://dev.csdn.net/develop/article/27/27950.shtm 。
在試驗時,發現一個問題,請看下面:
int main()
{
char *p,*q;
p = (char *)malloc(10);
strcpy(p,"abcdefghi/0");
printf("%d/n",p); //第一次malloc後p所指向的空間
q = p;
p = (char * )realloc(p,30);
printf("%d %s/n",p,p); //可以觀察realloc後p指向的地址同malloc後所指向的地址是否發生
//了變化,如果沒有變化就把realloc中的第二個參數再變大一些!
//此時q就指向了原來爲p分配的空間
//free(q); //你可以測試在註釋free(q)與否時,系統的反映
strcpy(q,"ABCdefghi/0"); //當free(q)被註釋時,程序運行沒有任何問題
//當free(q)沒被註釋時,程序運行出錯!
printf("%d %s/n",q,q);
char *s = (char *)malloc(20); //再重新分配一塊就知道了,以前的塊已經釋放了。
strcpy(s, "WWW.SINA.COM.CN/0");
printf("%d %s/n", s, s);
//問題來了,如果我在return 0;之前加一句printf("q=%s",q); (下面就稱其爲打印語句),在VISUAL C++6.0
中給出的結果是 "q=WWW.SINA.COM.CN " 。如果沒有加這一句,那麼我可以這樣理解:編譯器 認爲q的生命週期結束了,那麼就在其他的內存的分配過程中佔用了q的內存。事實上編譯器也就是這樣做了,我們可以看到打印出來的s的地址正是q的地址。但是,現在,程序後面還有對q的訪問,即其生命週期尚未結束,爲什麼編譯器就把q的內存空間佔用去了呢?這樣的話,那裏還有數據安全?
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.