最近我遇到了內存釋放問題。首先,打擊是C代碼:malloc和free的內存操作到底做了什麼?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p =(int*) malloc(5*sizeof (int));
int i ;
for(i =0;i<5; i++)
p[i ]=i;
p[i ]=i;
for(i =0;i<6; i++)
printf("[%p]:%d\n" ,p+ i,p [i]);
free(p);
printf("The memory has been released.\n");
}
顯然,有內存超出範圍的問題。當我使用VS2008編譯器,它給下面的輸出和有關內存釋放一些錯誤:
[00453E80]:0
[00453E84]:1
[00453E88]:2
[00453E8C]:3
[00453E90]:4
[00453E94]:5
然而,當我使用的cygwin的GCC 4.7.3編譯器,我得到下面的輸出:
[0x80028258]:0
[0x8002825c]:1
[0x80028260]:2
[0x80028264]:3
[0x80028268]:4
[0x8002826c]:51
The memory has been released.
顯然,代碼運行正常,但5沒有寫入內存。 因此,VS2008和gcc在處理這些問題上可能存在一些差異。 你們能給我一些關於這方面的專業解釋嗎?提前致謝。
您爲5個項目分配空間,但是索引超過了分配量的末尾。這是未定義的行爲,任何事情都可能發生。 –
你正在超越第二個for循環的分配範圍。 p [5]就是當時內存中的任何值。 – NmdMystery
Woops,我沒有看到額外的p [i] = i,這意味着最後的值應該是5.不知道gcc在那裏做什麼。 – NmdMystery