關於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;
 
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章