我的malloc数组更改了意外值吗?

时间:2018-10-24 00:36:46

标签: c arrays multidimensional-array malloc

这可能是我是菜鸟,但是....

我正在尝试使用动态分配的2D数组。我遵循了here所示的方法,在该方法中,他们使用大小为“行x列”的单个维度数组来解决。

当我做一些测试时,我用数字2填充数组的所有位置,然后我一直在访问单个位置并将其更改为9只是为了查看A(1),A(2 ),A(3)等相对于一维。

一切都按预期进行,直到我尝试修改A [5]为止,当我这样做时,数组的两个位置将被覆盖,而不是仅仅覆盖5个。关于发生了什么的任何想法?

顺便说一句,通过“ A [5]和A [4]”与“ *(A + 5)和*(A + 4)”对数组的位置进行寻址可以得到相同的结果。

感谢您的帮助! :)

此:

int main()
{
    int dim1, dim2, row, column, i=0;
    scanf("%d",&dim1);
    scanf("%d",&dim2);
    printf("dim1=%d dim2=%d\n", dim1, dim2);

    int *A;
    A=(int* )malloc(dim1*dim2*sizeof(int));
    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                    A[(row*dim1)+column]=2;
                    i++;
            }
    }
    printf("Before assignment\n");
    *(A+5)=9;//<<<<<<<-THIS IS WHERE I AM ACCESSING THE ARRAY
    printf("after assignment\n");


    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                   printf("%d ", A[(row*dim1)+column]);
            }
            printf("\n");
    }

结果是: Accessing A[5]

但是这个:

int main()
{
    int dim1, dim2, row, column, i=0;
    scanf("%d",&dim1);
    scanf("%d",&dim2);
    printf("dim1=%d dim2=%d\n", dim1, dim2);

    int *A;
    A=(int* )malloc(dim1*dim2*sizeof(int));
    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                    A[(row*dim1)+column]=2;
                    i++;
            }
    }
    printf("Before assignment\n");
    *(A+4)=9;//<<<<<<<-THIS IS WHERE I AM ACCESSING THE ARRAY
    printf("after assignment\n");


    for(row=0; row<dim1; row++)
    {
            for(column=0; column<dim2; column++)
            {
                   printf("%d ", A[(row*dim1)+column]);
            }
            printf("\n");
    }

结果是: Accessing A[4]

1 个答案:

答案 0 :(得分:2)

这是错误的地址。

A[(row*dim1)+column]=2;
       ^^^^

dim1应该是dim2

A[(row*dim2)+column]=2;

回想一下,dim1是行数,dim2是列数。将它们命名为nrowsncols或其他描述性名称可能会有所帮助。

A[(row*ncols)+column]=2;