我的代码如下:
#include <stdio.h>
#include <stdlib.h>
void mad(int ***, int, in);
int main(void) {
int **x;
int n,m;
scanf("%d%d",&n,&m);
mad(x,n,m);
x[0][0] = 5;
printf("%d\n",x[0][0]);
return 0;
}
void mad(int ***x, int n, int m) {
int i;
**x = malloc(sizeof(int *));
for (i = 0; i < n; i++)
***(x + i) = malloc(m * sizeof(int));
}
这是错误的,有人可以解释为什么这是错误的,并帮助我做对。
答案 0 :(得分:2)
你需要一个变量,它是一个指向指针的变量,所以声明它为:
int **x;
但是如果你想让另一个函数为它赋值,你需要传递指向该变量的指针,所以将函数声明为
void mad(int ***x,int n, int m);
通过传递指向变量的指针来调用它:
mad(&x,m,n);
并为解除引用的指针
分配一个新值void mad(int ***x,int n, int m)
{
*x = malloc(...);
}
顺便说一句,第一个malloc
调用似乎不正确 - 你分配的内存块足够大,可以保持一个指向int
的指针,而它可能应该n
指向int
}}:
*x = malloc(n*sizeof(int *));
然后分配n
个数组的行,每行m int
长:
for (i=0; i<n; i++)
*(*x + i) = malloc(m*sizeof(int));
答案 1 :(得分:1)
*x
指向数组的指针。 malloc(n * sizeof(int*));
分配一个指针数组。 *(*x+i)
或(*x)[i]
是一个数组。 malloc(m * sizeof(int));
分配一个数组。像这样调整你的代码:
void mad(int ***x, int n, int m){
int i;
*x = malloc(n * sizeof(int*)); // allocate memory where x refers to
for( i=0; i<n; i++ )
*(*x+i) = malloc(m * sizeof(int)); // similar to (*x)[i] = malloc(m * sizeof(int))
}
mad(&x,n,m);
// ^
答案 2 :(得分:0)
您应该避免所有这些低效的基于指针的指针查找表。它们不是数组,因为它们没有分配在相邻的存储单元中。
改为分配一个真正的2D数组:
void alloc2d ( size_t x, size_t y, int(**ptr)[x][y] )
{
*ptr = malloc ( sizeof(int[x][y]) );
}
int main (void)
{
const int x = 5;
const int y = 3;
int (*arr_ptr)[x][y];
alloc2d(x, y, &arr_ptr);
int (*array2d)[y] = *arr_ptr; // point at 1st element which is an array
array2d[i][j] = something;
...
free(arr_ptr);
}