C中的2D阵列初始化

Ala*_*irG 4 c multidimensional-array

我知道这是一个老栗子,但我想在我的代码中静态分配一个小的2D数组.我知道这样做的方法是:

static int A[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Run Code Online (Sandbox Code Playgroud)

那没关系,我可以访问它的所有成员.但是我有几个问题将它传递给函数,例如:

void print_matrix(int **a, int r, int c)
{
    int x, y;

    for(x = 0; x < r; x++)
    {
        printf("Row %02d = %#x = ", x, a[x]);

        for(y = 0; y < c; y++)
        {
            printf("%s%d", (0 == y) ? "" : ", ", a[x][y]);
        }
        printf("\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

首先我不能简单地传递A给函数,我需要将其转换为(int**).既然char *是同义词char [],我对此感到有些惊讶.其次,它崩溃,当我在调试器中检查时,在子函数内,a[0]报告为1而不是指向整数数组的指针.

我知道这里有编译器/ C语言的奥术魔法.但这有点令人困惑.如果我尝试初始化为:

static int *A[3] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Run Code Online (Sandbox Code Playgroud)

我收到了很多警告.这有何不同:

static char *S[3] = { "hello", "there", "stackoverflow" };
Run Code Online (Sandbox Code Playgroud)

除了奥术C魔法的问题,尽管有十多年的C编程我不知道怎么回事:(,我想知道如何生成我的数组,所以我可以成功地传递它,int **而不必经历所有的for循环的fag或将静态分配的数组复制到动态分配的数组.

以下工作会怎样?

int *A0 = { 1, 2 };
int *A1 = { 3, 4 };
int *A2 = { 5, 6 };
int **A = { A0, A1, A2 };
Run Code Online (Sandbox Code Playgroud)

有没有比这更好的方法呢?

谢谢,所有.

Ps我知道在现实生活中我们会将数据库或文件中的值读入动态分配的数组并避免所有这些.

lij*_*jie 10

多维数组不会成为多级指针(我不知道正确的术语).只有一个维度衰变.例如:

int [20]变得int *; int [20][5]成为int (*)[5](不是int **); 等等

如果非常希望使用多维数组(通过[r][c]语法),那么你必须传递其他边界(必须是常量).如果需要变量边界,我认为最好的选择是手动执行索引转换(即代替a[r][c]使用a[r*C + c]).

  • 在C99中,可以定义如下函数:"void f(int c,int a [] [c])..."或"void f(int c,int(*a)[c])... ".在此之后,您可以像任何其他多维数组一样索引数组. (2认同)