C:在main中有一个指向指针的指针,并在其他函数中创建一个数组

时间:2016-01-19 11:28:03

标签: c arrays function pointers

我的代码如下:

#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));
}

这是错误的,有人可以解释为什么这是错误的,并帮助我做对。

3 个答案:

答案 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);
}