我有一个函数在开始分配2D矩阵,一个函数释放它,我在结尾使用它。
int** CreatMat(int N){
int i,**T;
T = (int**)malloc(sizeof(int*)*N);
if(T!=NULL){
for(i=0;i<N;i++){
T[i]=(int*)malloc(sizeof(int)*N);
if(T[i]==NULL){
printf("\nCreatMat()::Allocation failed at block %d",i);
for(i=i;i>=0;i--){
free(T[i]);
T[i]=NULL;
}
free(T);
T=NULL;
return T;
}
}
}
return T;
}
//Free a dynamic matrix.
void FreeMat(int** T,int N){
int i;
for(i=0;i<N;i++){
free(T[i]);
T[i]=NULL;
}
free(T);
T = NULL;
}不知怎么的,FreeMat()崩溃了。有什么帮助吗?
全码这里
~janky修复代码这里
发布于 2022-01-10 23:52:59
在函数main()中
int **T, **S;
if(Grids_Init(T, S) != 0)不影响未初始化的局部变量S和T的值,然后继续释放这些不确定的指针。
您可以使用一个函数初始化其中一个指针,返回指针并将其赋值给T。S也是如此。
这比使用三星级指针更好:请参阅C中的三重指针:这是一个风格问题吗? One答案。
使用三重指针会损害可读性和可维护性。
发布于 2022-01-11 01:27:54
您不创建2D数组,只创建一个指针数组。使您的生活更容易,并找到一个真正的2D数组。此外,对size_t大小使用正确的类型
void CreatMat(size_t N, int (**array)[N])
{
*array = malloc(N * sizeof(**array));
}
int main(void)
{
int (*array)[N];
CreatMat(1000, &array);
/* some code */
free(array);
}看看有多简单。
发布于 2022-01-11 14:19:08
对@0_______的回应
#include <stdlib.h>
int main(){
int i,j;
int (*T)[7];
//(*T)[7] = malloc(7*sizeof(&(*T))); is wrong
T = malloc(7*sizeof(*T));
for(i=0;i<7;i++){
printf("\n");
for(j=0;j<7;j++){
printf("%d ");
}
}
free(T);
return 0;
}https://stackoverflow.com/questions/70659871
复制相似问题