在C中为二维数组中的其他行赋值

时间:2013-01-11 19:25:02

标签: multidimensional-array

HI我正在尝试理解指针和数组,当我在youtube上观看视频时,我发现了这个我试图自己创建的例子。以下是代码。

#include <stdio.h>
#include <math.h>
main()
{
    int arr[][2]={{11,12},{21,22},{31,32},{41,42},{51,52}};
    int i,j;
    arr[5][1]=61;
    arr[5][0]=62;
    arr[6][1]=71;
    arr[6][0]=72;
    arr[7][1]=81;
    arr[7][0]=82;
    for(i=0;i<=7;i++)
    {
        for(j=0;j<=1;j++)
        {
            printf("%d  %d  %u  %u  %d  %d  %d  \n",i,j,arr[i],arr[i]+j,arr[i][j],*(*(arr+i)+j),*(arr[i]+j));
        }
    }
}

当我执行代码时,它给了我

0   0   3216856768  3216856768  11  11  11  
0   1   3216856768  3216856772  12  12  12  
1   0   3216856776  3216856776  21  21  21  
1   1   3216856776  3216856780  22  22  22  
2   0   3216856784  3216856784  31  31  31  
2   1   3216856784  3216856788  32  32  32  
3   0   3216856792  3216856792  41  41  41  
3   1   3216856792  3216856796  42  42  42  
4   0   3216856800  3216856800  51  51  51  
4   1   3216856800  3216856804  52  52  52  
5   0   3216856808  3216856808  0   0   0   
5   1   3216856808  3216856812  5   5   5   
6   0   3216856816  3216856816  72  72  72  
6   1   3216856816  3216856820  71  71  71  
7   0   3216856824  3216856824  82  82  82  
7   1   3216856824  3216856828  81  81  81  

为什么arr [5] [0]和arr [5] [1]没有被分配给定值? 5和0来自哪里?

1 个答案:

答案 0 :(得分:3)

C不是魔术(也不是脚本语言)。如果创建一个包含5个元素的数组,那么它将包含5个元素。无论你用它做什么,它都不会自动扩展。之后,如果您从其边界访问数组,则会导致未定义的行为。这段代码甚至可能崩溃。

你应该做的是要么声明一个足够大的数组:

int arr[8][2] = { { 11, 12 }, { 21, 22 }, { 31, 32 }, { 41, 42 }, { 51, 52 } };

然后您可以正确分配给他们;或使用标准内存管理函数malloc()realloc()

使用动态扩展数组
int **arr = malloc(sizeof(*arr) * 5);
int i;
for (i = 0; i < 5; i++) {
    arr[i] = malloc(sizeof(**arr));
}

并逐一填写

arr[0][0] = 11;
arr[0][1] = 12;
// etc.

然后在需要时展开它:

arr = realloc(arr, sizeof(*arr) * 8);
for (i = 5; i < 8; i++) {
    arr[i] = malloc(sizeof(**arr));
}

在此之后,您也可以安全地使用arr[5]...arr[7]。但是,在后一种情况下,不要忘记free()使用后需要释放的所有指针。