朋友們對C語言malloc函數(shù)應(yīng)該是比較熟悉了,此函數(shù)功能是分配一段內(nèi)存地址,并且將內(nèi)存地址給一個C程序的指針變量,最后記得再調(diào)用free函數(shù)釋放這段內(nèi)存地址就可以了,標(biāo)準(zhǔn)的流程對吧,好像沒什么問題。但是按照此標(biāo)準(zhǔn)流程,下面的C語言程序卻有個奇怪的現(xiàn)象:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char *p = (char *)malloc(6);
if(NULL == p)
{
printf("內(nèi)存分配失敗! ");
return -1;
}
else
{
memset(p, 0, 6);
strcpy(p, "12345");
*(p + 5) = '';
while( ('4' != *p) && ('' != *p) )
{
p++;
}
free(p);
}
return 0;
}
程序不難,功能就是使用C語言malloc函數(shù)分配一段內(nèi)存空間,用于存放6個字符數(shù)據(jù)”123456“,最后使用C語言free函數(shù)來釋放這段內(nèi)存地址??墒且贿\行結(jié)果就報錯了,如下:
我奇了個怪的!
調(diào)試吧!調(diào)著調(diào)著,我了個去,我發(fā)現(xiàn)malloc函數(shù)分配的這一段內(nèi)存空間的起始地址是”0x00382c88“,也就是說C語言指針變量p的值是”0x00382c88“,地址為”0x00382c88“的一段內(nèi)存存放著字符‘1’。經(jīng)過C程序while循環(huán)后,指針變量p指向字符‘4’了,而字符‘4’在內(nèi)存中的地址是”0x00382c8b“,也就是指針p的值是”0x00382c8b“。此時跳出while循環(huán),緊接著調(diào)用free函數(shù),我的原意是想釋放從”0x00382c88“開始的內(nèi)存區(qū)域,現(xiàn)在變成釋放了從”0x00382c8b“開始的內(nèi)存區(qū)域,因此報了這個錯!
好了,找到原因了,那就修改下程序吧。一種解決方法是使用另一個C語言指針變量q, q初始也指向字符‘1’,在while循環(huán)中使用指針變量q而不是p,程序修改如下:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
char *p = (char *)malloc(6);
char *q = NULL;
if(NULL == p)
{
printf("內(nèi)存分配失敗! ");
return -1;
}
else
{
q = p;
memset(p, 0, 6);
strcpy(p, "12345");
*(p + 5) = '';
while( ('4' != *q) && ('' != *q) )
{
q++;
}
free(p);
}
return 0;
}
這樣,在while循環(huán)中指針變量q最終指向字符‘4’,而指針變量p依然指向字符‘1’,也就是指針變量p的值依舊是”0x00382c88“,也就是分配的內(nèi)存的起始地址!
本文代碼是在微軟的VC6.0上編譯與運行。