小心誤用C語(yǔ)言的free()函數(shù)

朋友們對(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ò)了,如下:

小心誤用C語(yǔ)言的free()函數(shù)

我奇了個(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)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,606評(píng)論 3 44
  • 幾種語(yǔ)言的特性 匯編程序:將匯編語(yǔ)言源程序翻譯成目標(biāo)程序編譯程序:將高級(jí)語(yǔ)言源程序翻譯成目標(biāo)程序解釋程序:將高級(jí)語(yǔ)...
    囊螢映雪的螢閱讀 3,056評(píng)論 1 5
  • 姓名:李濤 學(xué)號(hào):17021211100 轉(zhuǎn)載自http://mp.weixin.qq.com/s/YUXrJbi...
    關(guān)公面前疊飛機(jī)閱讀 1,613評(píng)論 1 9
  • 最全的iOS面試題及答案 iOS面試小貼士 ———————————————回答好下面的足夠了-----------...
    zweic閱讀 2,796評(píng)論 0 73
  • 因?yàn)樯钸M(jìn)入不同階段,開(kāi)始不斷給自己定目標(biāo),加壓力,再也不敢像大學(xué)一樣無(wú)憂無(wú)慮,單純的泡圖書(shū)館,過(guò)級(jí),考證。開(kāi)始學(xué)...
    陳鑫淼閱讀 488評(píng)論 0 1

友情鏈接更多精彩內(nèi)容