int main(int argc, char **argv)
{
float f_value[] = { 1,2,3,4,5 };
float *fp=NULL;
//fp = (float *)malloc(30 * sizeof(float));
fp = f_value;
free(fp);
return 0;
}
這段代碼不管加不加malloc,free時都會報錯。我知道fp在fp = f_value;時指向的記憶體已經不是原來的記憶體了,但是我的目的是想free(fp)。有什么好的辦法嗎?(這里只是個demo,實際應用時f_value是個函式傳參傳遞給fp)
uj5u.com熱心網友回復:
free只能釋放malloc開辟的記憶體,f_value是堆疊變數,不用freeuj5u.com熱心網友回復:
f_value改成動態陣列,也用malloc申請記憶體就可以陣列記憶體是固定的,在堆疊里,函式結束堆疊退出后會自動被回收,所以你自己不能free堆疊里的記憶體。
動態分配記憶體是在堆上的,跟堆疊沒關系,堆疊退出也不會自動回收,所以才需要自己去free。
uj5u.com熱心網友回復:
那不能先free再賦值么?uj5u.com熱心網友回復:
感謝!。。。f_value如果是傳參怎么辦?int Dll_Start(float *f_value) {
float *fp = NULL;
//fp = (float *)malloc(30 * sizeof(float));
fp = f_value;
free(fp);
return 0;
}
uj5u.com熱心網友回復:
你是想要把f_value的內容賦值給fp(malloc分配的空間吧)
int main(int argc, char **argv)
{
float f_value[] = { 1,2,3,4,5 };
float *fp=NULL;
fp = (float *)malloc(30 * sizeof(float));
if ( fp != NULL )
{
memcpy(fp, &f_value[0], sizeof( f_value) );
}
else
{
/* Error process...... */
}
free(fp);
return 0;
}
uj5u.com熱心網友回復:
請時刻牢記free和malloc一定是成對出現的,沒有用malloc,就不要用freeuj5u.com熱心網友回復:
謝謝,我知道,我的意思是即使用了malloc,也會報錯。這里。
uj5u.com熱心網友回復:
感謝。。。這里只能用memcpy??我嘗試過,這個有點慢,實際應用中,我的資料量有點大,就沒有直接fp = f_value;的辦法嗎?
uj5u.com熱心網友回復:
fp=f_value不是不可以,那你就沒必要free了。理由上面已經說過了,f_value是堆疊記憶體,堆疊退出會自動回收,不能自己free。
也就是說你的dll_start函式內部不需要管理free,因為dll_start不知道引數的指標是指向堆疊記憶體還是堆記憶體,所以沒必要去強制free。free應該由記憶體申請的者去自己控制,dll_start不需要越俎代庖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/237808.html
標籤:C語言
上一篇:有沒有大佬用proteus7
