1

我正在尝试使用 calloc 和 malloc 来创建二维数组。到目前为止,我的逻辑是首先使用 calloc 创建一个整数指针数组,然后使用 malloc 来创建第二维。这是我的代码:

enter code here


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

    int main()
    {
        int N,M,i=0,j=0;

        printf("Give the dimensions");
        scanf("%d%d",&N,&M);
        printf("You gave N: %d and M: %d\n",N,M);

        int **a=(int**)calloc(N,sizeof(int*));

        for(i=0; i<N; i++)
        {
            a[i]=(int*)malloc(M*sizeof(int));
        }

        printf("The array that was created resigns on addresses\n");
        for(i=0; i<N; i++)
        {
            for(j=0; j<M; j++)
            {
                printf("addr: %p\n",a[i,j]);
            }
        }
    }

有了这个,我想确保我创建了我想要的数组。给出维度 N=2 和 M=2(只是一个例子),我取地址(例如): (0,0): 0x00001, (0,1):0x00003, (1,0): 0x00001, (1 ,1): 0x00003。因此,我没有得到一个二维数组,而只是一个只有 2 个位置的简单数组。你能指出我的编码错误吗?没找到。。。:S

4

2 回答 2

3

索引访问运算符的错误使用[]。您没有访问第 i 行和第 j 列,而是仅访问j元素,因为您使用了逗号运算符:

a[i,j] == a[j]

相反,您必须访问给定的行,然后访问一个单元格:

a[i][j]

请注意,这不会返回地址,而是int

typeof a       == int **
typeof a[i]    == int *
typeof a[i][j] == int

如果您仍想知道条目的地址,则必须使用&a[i][j]a[i]+j

于 2013-01-03T20:43:06.443 回答
2
printf("addr: %p\n",a[i,j]);

那是

printf("addr: %p\n",a[j]);

您在那里使用逗号运算符。

要访问 -th 数组的j-th 元素i,您可以使用

a[i][j]

但这将是int此处,而不是指针,因此将在转换中printf调用未定义的行为。%p

于 2013-01-03T20:43:14.493 回答