首先看個問題程序:
#include <stdlib.h>
#include <stdio.h>
void main()
{
int *i;
i=(int *)malloc(sizeof(int));
*i=1;
*(i+1)=2;
printf(\"%x|%d\\n\",i,*i);
printf(\"%x|%d\",i+1,*(i+1));
}
輸出的結果是:
8fc|1
8fe|2
這個程序編譯通過,運行正常,說它有問題,問題出在哪呢?
首先通過malloc,建了一個大小為2的堆,
i指向的地址是8fc,i+1指向的地址是8fc+sizeof(int)=8fe
但是地址8fe是不受保護的,因為它不是機器分配給i+1的,隨時會被其他變量占用。
正確的做法是
#include \"stdlib.h\"
#include \"stdio.h\"
void main()
{
int *i;
i=(int *)malloc(sizeof(int));
*i=1;
i=(int *)realloc(i,2*sizeof(int));
*(i+1)=2;
printf(\"%x|%d\\n\",i,*i);
printf(\"%x|%d\",i+1,*(i+1));
}
realloc
可以對給定的指針所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有內存的中內容將保持不變。當然,對于縮小,則被縮小的那一部分的內容會丟失。
realloc 并不保證調整后的內存空間和原來的內存空間保持同一內存地址。相反,realloc 返回的指針很可能指向一個新的地址。
所以,在代碼中,我們必須將realloc返回的值,重新賦值給 p :
p = (int *) realloc (p, sizeof(int) *15);
甚至,你可以傳一個空指針(0)給 realloc ,則此時realloc 作用完全相當于malloc。
int* p = (int *) realloc (0,sizeof(int) * 10); //分配一個全新的內存空間,
這一行,作用完全等同于:
int* p = (int *) malloc(sizeof(int) * 10);
from:
http://blog.c114.net/html/07/206807-17133.html
posted on 2010-03-01 22:07
chatler 閱讀(221)
評論(0) 編輯 收藏 引用 所屬分類:
C++_BASIS