c语言中二重指针如何赋值,关于二重指针释放的有关问题
關于二重指針釋放的問題
使用?malloc?來申請內存,申請的代碼部分如下:
float?*fp?=?(float*)malloc(sizeof(float)*?h?*?w);
float?**cost?=?(float**)malloc(sizeof(float*)*?h);
for?(int?i?=?0;?i?
cost[i]?=?&fp[i?*?w];
}
那我釋放的時候應該如何釋放呢?
我現在采用的辦法是:
for?(int?i?=?0;?i?
free(cost[i]);
cost[i]?=?NULL;
}
free(fp);
顯然,這個代碼在循環的時候就報錯了……所以想請教一下大家正確的姿勢。
------解決思路----------------------
有幾次malloc就使用幾次free;而且二者的地址必須相同;
malloc分配的內存,是有簿記的;只能在分配的地址上釋放;否則沒法找到大小信息(free用來釋放);
所以,不能夠“free(cost[i]);”;
而只能:free(fp);(或者等價的cost[0]);
------解決思路----------------------
free?(fp);
free?(cost);
或者
free?(*cost);
free?(cost);
也就是free的次數必須和malloc的次數相同。雖然你分配內存時在for循環中的行為很奇怪(通常二重指針不是這么申請內存的)。
------解決思路----------------------
僅供參考:#include?
#include?
#include?
int?**newarr2d(int?rows,int?cols)?{
int?**p,i;
p=(int?**)malloc(rows*sizeof(int?*));
if?(NULL==p)?exit(1);
for?(i=0;i
p[i]=(int?*)malloc(cols*sizeof(int));
if?(NULL==p[i])?exit(1);
}
return?p;
}
void?deletearr2d(int?**p,int?rows)?{
int?i;
for?(i=0;i
free(p[i]);
}
free(p);
}
int?main()?{
int?**arr2d,i,j,r,c;
r=4;
c=5;
//在堆中開辟一個4×5的二維int數組
arr2d=newarr2d(r,c);
for?(i=0;i
for?(j=0;j
arr2d[i][j]=i*c+j;
}
}
for?(i=0;i
for?(j=0;j
printf("?%2d",arr2d[i][j]);
}
printf("\n");
}
deletearr2d(arr2d,r);
r=6;
c=3;
//在堆中開辟一個6×3的二維int數組
arr2d=newarr2d(r,c);
for?(i=0;i
for?(j=0;j
arr2d[i][j]=i*c+j;
}
}
for?(i=0;i
for?(j=0;j
printf("?%2d",arr2d[i][j]);
}
printf("\n");
}
deletearr2d(arr2d,r);
return?0;
}
//??0??1??2??3??4
//??5??6??7??8??9
//?10?11?12?13?14
//?15?16?17?18?19
//??0??1??2
//??3??4??5
//??6??7??8
//??9?10?11
//?12?13?14
//?15?16?17
//
總結
以上是生活随笔為你收集整理的c语言中二重指针如何赋值,关于二重指针释放的有关问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何批量提取文件名到excel如何批量提
- 下一篇: 单片机矩阵消抖延时c语言,单片机矩阵按键