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



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

  • 在函数内部printMatrix索引A,如果使用mainA的内存是使用 malloc 分配的,则A[i][j]工作
  • 在函数内部printMatrix索引A如果静态分配了mainA的内存(如注释代码中所示(,则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中的"静态"有两种含义,它们都不是你认为的那样......

相关内容

  • 没有找到相关文章

最新更新