C中的2D阵列初始化

时间:2010-12-10 14:11:24

标签: c multidimensional-array

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

static int A[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

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

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");
    }
}

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

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

static int *A[3] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

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

static char *S[3] = { "hello", "there", "stackoverflow" };

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

以下是否有效?

int **

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

谢谢,所有。

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

5 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:2)

我首先咨询this question in the C FAQ,然后是entire section

答案 2 :(得分:2)

int A0[2] = { 1, 2 };
int A1[2] = { 3, 4 };
int A2[2] = { 5, 6 };
int *A[3] = { A0, A1, A2 };

你接近最后一节,但需要稍微不同的声明。生成的A可以作为int **传递给函数。

这样,print_matrix(A, 3, 2);输出:

Row 00 = 0x5eaeda70 = 1, 2
Row 01 = 0x5eaeda68 = 3, 4
Row 02 = 0x5eaeda60 = 5, 6

答案 3 :(得分:1)

最快捷的方法是将参数a声明为int a[][2]

void print_matrix(int[][2] a, int r, int c);

// and call the function like this:
print_matrix(A, 3, 2);

答案 4 :(得分:0)

static char *S[3] = { "hello". "there", "stackoverflow" };
                          // ^~~~~~ This is a period.