0

嗨,我正在尝试理解指针和数组,在浏览 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 是从哪里来的?

4

1 回答 1

3

这不是魔术(也不是脚本语言)。如果您创建一个有 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()使用后需要释放的所有指针。

于 2013-01-11T19:31:40.127 回答