朋友們對(duì)C語(yǔ)言malloc函數(shù)應(yīng)該是比較熟悉了,此函數(shù)功能是分配一段內(nèi)存地址,并且將內(nèi)存地址給一個(gè)C程序的指針變量,最后記得再調(diào)用free函數(shù)釋放這段內(nèi)存地址就可以了,標(biāo)準(zhǔn)的流程對(duì)吧,好像沒(méi)什么問(wèn)題。但是按照此標(biāo)準(zhǔn)流程,下面的C語(yǔ)言程序卻有個(gè)奇怪的現(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語(yǔ)言malloc函數(shù)分配一段內(nèi)存空間,用于存放6個(gè)字符數(shù)據(jù)”123456“,最后使用C語(yǔ)言free函數(shù)來(lái)釋放這段內(nèi)存地址??墒且贿\(yùn)行結(jié)果就報(bào)錯(cuò)了,如下:
我奇了個(gè)怪的!
調(diào)試吧!調(diào)著調(diào)著,我了個(gè)去,我發(fā)現(xiàn)malloc函數(shù)分配的這一段內(nèi)存空間的起始地址是”0x00382c88“,也就是說(shuō)C語(yǔ)言指針變量p的值是”0x00382c88“,地址為”0x00382c88“的一段內(nèi)存存放著字符‘1’。經(jīng)過(guò)C程序while循環(huán)后,指針變量p指向字符‘4’了,而字符‘4’在內(nèi)存中的地址是”0x00382c8b“,也就是指針p的值是”0x00382c8b“。此時(shí)跳出while循環(huán),緊接著調(diào)用free函數(shù),我的原意是想釋放從”0x00382c88“開(kāi)始的內(nèi)存區(qū)域,現(xiàn)在變成釋放了從”0x00382c8b“開(kāi)始的內(nèi)存區(qū)域,因此報(bào)了這個(gè)錯(cuò)!
好了,找到原因了,那就修改下程序吧。一種解決方法是使用另一個(gè)C語(yǔ)言指針變量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上編譯與運(yùn)行。