我有一个与索引传递给 C 函数的 2d 数组相关的基本问题。当我使用双指针传递它时:
- 在函数内部
printMatrix
索引A
,如果使用main
中A
的内存是使用malloc
分配的,则A[i][j]
工作 - 在函数内部
printMatrix
索引A
如果静态分配了main
中A
的内存(如注释代码中所示(,则A[i][j]
不起作用。我相信我应该使用:*(*(A+i*N)+j)
但是为什么A[i][j]
适用于上述情况时不起作用?
void printMatrix(int** A,int N) {
int i=0,j=0;
for(i=0;i<N;i++) {
for(j=0;j<N;j++) {
printf("%2d",A[i][j]);
}
printf("n");
}
printf("n");
return;
}
int main() {
//int A[6][6] = {{1,1,1,1,1,1},{2,2,2,2,2,2},{3,3,3,3,3,3},
//{4,4,4,4,4,4},{5,5,5,5,5,5},{6,6,6,6,6,6}};
int N = 6,i,j;
int **A = (int**)malloc(sizeof(int*)*N);
for(i=0;i<N;i++)
A[i] = (int*)malloc(sizeof(int)*N);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
A[i][j] = i+j;
printMatrix((int**)A,N);
return 0;
}
从分析的角度来看,如果我们在main中声明一个具有自动存储持续时间的数组,例如:
int A[6][6];
我们可以使用 sizeof A
来测量此分配的大小,这将等于 sizeof (int) * 6 * 6
。
但是,在下面的代码中,您将分配sizeof (int *) * 6 + sizeof (int) * 6 * 6
字节:
int N = 6,i,j;
int **A = (int**)malloc(sizeof(int*)*N);
for(i=0;i<N;i++)
A[i] = (int*)malloc(sizeof(int)*N);
这应该表明您对数组的理解存在缺陷,并且您做了太多的工作。首先,数组是单个连续的内存块,而您分配的不是。您调用malloc
的次数太多,并且分配了太多字节。
如果你通过学习更多关于 C 的知识来继续磨砺你的斧头,你将学到一些巧妙的技巧,例如通过一次分配、分配相同数量的字节和一行代码来实现你的目标:
int (*A)[N] = malloc(N * sizeof *A);
您可能需要调整print_matrix
类型以反映A
的变化,如下所示:
void printMatrix(size_t N, int (*A)[N])
附言不要施放马洛克
P.P.S. 检查malloc
以获取NULL
返回值。
P.P.P.S.C中的"静态"有两种含义,它们都不是你认为的那样......