如何动态地从数组中获取单元格值? [C89]

How to get a cell value from an array dynamically? [C89]

我有这个数组:

array[0][0] = 1; 
array[0][1] = 2;
array[0][2] = 3;
array[0][3] = 4;

我怎么能做这样的事情?

int a = 0;
int b = 1;

printf("%d",array[a][b]);

C89 是一项要求。这是一个 MCVE:

int main(int argc, char *argv[])
{
    int array[0][4] = {1, 2, 3, 4}, i = 0;

    for (i = 0 ; i < 4 ; i++)
    {
        printf("%d\n", array[0][i]);
    }

    return 0;
}

输出:

1512079328
32764
0
3

您的数组第一维至少需要 1 个,第二维至少需要 4 个。

int array[1][4];
//        ^  ^

原因:C 和 C++ 中的数组具有从 0size - 1 的有效索引。所以如果你想访问索引 0 ... 3 数组的大小必须至少是 4.

问题的原因可能是 gcc "gnu mode" (gnu89),它是旧版编译器的默认编译器设置。它不会根据 C 标准编译您的代码,而是根据 gnu 发明的非标准。因此,您的严重错误已通过。

如果您改为使用 -std=c89 -pedantic-errors 将代码编译为 C 语言,您将获得以下诊断消息列表:

error: ISO C forbids zero-size array 'array' [-Wpedantic]|    
warning: missing braces around initializer [-Wmissing-braces]|    
warning: (near initialization for 'array[0]') [-Wmissing-braces]|   
error: excess elements in array initializer|   
error: (near initialization for 'array')|  

原因如前所述,声明期间的数组大小与访问期间的数组索引不同。当修复并编译为 C 语言时,它编译干净并正确运行:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int array[1][4] = { {1, 2, 3, 4} };
    int i;

    for (i = 0 ; i < 4 ; i++)
    {
        printf("%d\n", array[0][i]);
    }

    return 0;
}