在C中,我试图在任何函数之外声明一个2D数组,以便它可以被函数共享。我知道在单维情况下你可以做以下事情(并让它表现得像一个数组): -
#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;
}
我想知道这对多维案例有何用处。
答案 0 :(得分: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;
}
你应该警惕的事情:
答案 1 :(得分:0)
如果要使用带有[]
运算符的两个索引来访问它,则需要使用指向int
的指针并分配每个单个内部1D数组:
int **ptr = malloc(R*sizeof(int*));
for (int i = 0, i < R; ++i)
ptr[i] = malloc(C*sizeof(int));
ptr[i][j] = 40;
但您也可以直接创建一个{1}元素的1D数组,然后通过计算正确的索引R*C
或ptr[R*i + j]
来访问它。
答案 2 :(得分:0)
只要您修复第二个维度,您基本上可以使用相同的“技巧”:
double (*A)[42];
如果第二个维度也是动态的,你必须在函数范围内声明它:
double (*B)[n];
作为指向VLA,可变长度数组的指针,然后将指针传递给数组以作为
void f(size_t m, double (*aB)[m]);
你一次性分配这样一个2D数组
B = malloc(sizeof(double[m][n]));
因此您可以确保矩阵是连续分配的。