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

朋友們對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é)果就報錯了,如下:

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

我奇了個怪的!

調(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上編譯與運行。

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

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

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

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