【问题标题】:2D array initialisation in CC中的二维数组初始化
【发布时间】:2010-12-10 14:11:24
【问题描述】:

我知道这是一个旧栗子,但我希望在我的代码中静态分配一个小的二维数组。我知道这样做的方法是:

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 编程经验,但不知何故我从未学过这个问题 :(,我想知道如何生成我的数组,这样我就可以成功地将它作为 int ** 传递而无需必须经历所有的 for 循环或将静态分配的数组复制到动态分配的数组。

以下是否可行?

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

还有比这更好的方法吗?

谢谢大家。

附:我知道在现实生活中,我们会从数据库或文件中读取值到动态分配的数组中并避免所有这些东西。

【问题讨论】:

标签: c multidimensional-array


【解决方案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);

【讨论】:

  • 这是c,所以void print_matrix(int a[][2], &lt;etc&gt;)
【解决方案2】:

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

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])...”。在此之后,您可以像任何其他多维数组一样索引该数组。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2011-09-29
    • 2011-12-26
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多