我很确定那些了解指针方式的人会对我生气,因为这似乎是一个已经回答过的问题,但是我无法理解我在做这个三重指针时做错了什么......所以我提前道歉......
我试图通过这个函数动态分配一个二维数组:
#include <stdio.h>
#include <stdlib.h>
float **alloctab(int dim1, int dim2) {
float **ptr;
ptr = malloc(dim1*sizeof(float *));
if (ptr != NULL) {
int i, taille_ligne = dim2*sizeof(float);
float *tmp = malloc(dim1*taille_ligne);
if (tmp != NULL) {
for (i=0; i<dim1; i++) {
ptr[i] = tmp;
tmp += dim2;
}
}
else
ptr = NULL;
}
return(ptr);
}
int call_alloc(float ***ptr, int d1,int d2)
{
int i,j;
*ptr = alloctab(d1,d2);
for (i=0;i<d1;i++)
for (j=0;j<d2;j++)
{
*ptr[i][j]=(float)i+(float)j;
printf("ptr[%d][%d]=%f\n",i,j,*ptr[i][j]);
}
return 0;
}
int main()
{
float ***tab = NULL;
int d1=6,d2=8;
call_alloc(tab,d1,d2);
return 0;
}
当然我在使用它时会遇到分段错误,虽然-Wall模式下的编译器不会抱怨任何事情......
感谢您的帮助!!
答案 0 :(得分:1)
您的代码中有两个错误:
*ptr[i][j]
与(*ptr)[i][j]
float ***tab = NULL; call_alloc(tab,d1,d2);
将NULL指针传递给函数call_alloc
像这样调整你的代码:
int call_alloc(float ***ptr, int d1,int d2)
{
int i,j;
*ptr = alloctab(d1,d2);
for (i=0;i<d1;i++)
{
for (j=0;j<d2;j++)
{
(*ptr)[i][j]=(float)i+(float)j;
// ^ ^
printf("ptr[%d][%d]=%f\n",i,j,(*ptr)[i][j]);
// ^ ^
}
}
return 0;
}
int testmain()
{
float **tab = NULL;
// ^^
int d1=6,d2=8;
call_alloc(&tab,d1,d2);
// ^
return 0;
}
请注意,您的代码不会free
内存。
答案 1 :(得分:-1)
只需使用以下代码替换此代码,
int call_alloc(float **ptr, int d1,int d2)
{
int i,j;
ptr = alloctab(d1,d2);
for (i=0;i<d1;i++)
for (j=0;j<d2;j++)
{
ptr[i][j]=(float)i+(float)j;
printf("ptr[%d][%d]=%f\n",i,j,ptr[i][j]);
}
return 0;
}
int main()
{
float **tab = NULL;
int d1=6,d2=8;
call_alloc(tab,d1,d2);
return 0;
}