0

在 C 中,我试图在任何函数之外声明一个二维数组,以便函数可以共享它。我知道在一维情况下您可以执行以下操作(并使其表现得像一个数组):-

#include<stdlib.h>
#include<stdio.h>

int *ptr;

int main(){
  int n=5;
  int i;

  ptr = malloc(n*sizeof(*ptr));
  for(i=0; i<n; i++){
    ptr[i] = i;
    printf("%i\n", ptr[i]);
  }
  free(ptr);
  return 0;
}

我想知道这对多维情况如何起作用。

4

3 回答 3

1

您只需使用双指针,而不是单指针:

#include<stdlib.h>
#include<stdio.h>

int **ptr;

int main() {
  int n = 5;
  int m = 10;
  int i, j;

  ptr = malloc(n * sizeof(int*));
  for(i=0; i<n; i++) {
    ptr[i] = malloc(m * sizeof(int));
    for(j=0; j<m; j++) {
      ptr[i][j] = j;
      printf("%i\n", ptr[i][j]);
    } 
  }

  for(i=0; i<n; i++) {
    free(ptr[i]);
  }
  free(ptr);

  return 0;
}

你应该警惕的事情:

  • 分别分配每个数组
  • 分别释放每个数组,整个
于 2013-05-26T17:15:36.540 回答
0

如果您想使用两个带有[]运算符的索引来访问它,那么您将需要使用指向指针的指针int并分配每个内部一维数组:

int **ptr = malloc(R*sizeof(int*));
for (int i = 0, i < R; ++i)
  ptr[i] = malloc(C*sizeof(int));

ptr[i][j] = 40;

但您也可以直接创建单个 1DR*C元素数组,然后通过计算正确的索引ptr[R*i + j]ptr[C*j + i].

于 2013-05-26T17:14:02.903 回答
0

只要你修复第二个维度,你基本上可以使用相同的“技巧”:

double (*A)[42];

如果第二个维度也是动态的,则必须在函数范围内声明它:

double (*B)[n];

作为指向 VLA 的指针,可变长度数组,然后将指向数组的指针传递给函数

void f(size_t m, double (*aB)[m]);

你会一次性分配这样一个二维数组

B = malloc(sizeof(double[m][n]));

因此您可以确保您的矩阵是连续分配的。

于 2013-05-26T17:16:24.857 回答