gpt4 book ai didi

c - 静态数组的二维数组索引失败

转载 作者:行者123 更新时间:2023-11-30 15:12:24 26 4
gpt4 key购买 nike

我有一个与索引传递给 C 函数的二维数组相关的基本问题。当我使用双指针传递它时:

  • 函数内部 printMatrix索引 AA[i][j]如果内存为 A 则有效在main使用 malloc 进行分配
  • 函数内部 printMatrix索引 AA[i][j]如果内存为 A 则不起作用在main是静态分配的(如注释代码中所示)。我相信我应该使用:*(*(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 的类型以反射(reflect) A 的更改,如下所示:

void printMatrix(size_t N, int (*A)[N])

附注Don't cast malloc

P.P.S。检查 malloc 是否有 NULL 返回值。

P.P.P.S。 C 中的“静态”有两种含义,但它们都不是您想象的那样......

关于c - 静态数组的二维数组索引失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35098325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com