C:如何避免传递2d数组时的“可变长度错误”?

e5nqia27  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(104)

这是我先前问题的跟进。下面的简单代码可以打印矩阵,在我的家用电脑上没有任何错误或警告(GNU GCC编译器):

#include <stdio.h>
#include <stdlib.h>

void printMatrix(int rows, int columns, int matrix[rows][columns]);

void printMatrix(int rows, int columns, int matrix[rows][columns])
{
  for (int i = 0; i < rows; i = i + 1)
    {
      for (int j = 0; j < columns; j = j + 1)
        {
          printf("%d ", matrix[i][j]);
          if (j == columns - 1)
            printf("\n");
        }
    }
  printf("\n");
}

int main()
{
    int matrix[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    };

    int rows = 3;
    int columns = 4;
    printMatrix(rows, columns, matrix);
}

然而,当我试图在另一台计算机上使用它(使用Clang编译器)时,我得到错误:
||=== Build:Debug in Test(编译器:LLVM Clang编译器)===|
...|5|错误:使用了可变长度数组[-Werror,-Wvla]|
...|5|错误:使用了可变长度数组[-Werror,-Wvla]|
...|7|错误:使用了可变长度数组[-Werror,-Wvla]|
...|7|错误:使用了可变长度数组[-Werror,-Wvla]|||=生成失败:4错误,0警告(0分钟,0秒)===
据我所知,这个错误是“矩阵[行][列]”使用可变长度的抱怨。你能告诉我如何修复这个错误,以便我仍然可以使用“printMatrix”以同样的方式对任意大的矩阵?

myss37ts

myss37ts1#

1.代码是正确的,也是完成你想完成的事情的最直接的方法。我建议您删除-Wvla选项。
1.您可以将其设置为编译时常量:

#include <stdio.h>
#include <stdlib.h>

#define ROWS 3
#define COLUMNS 4

void printMatrix(int matrix[ROWS][COLUMNS]) {
    for (int i = 0; i < ROWS; i = i + 1) {
        for (int j = 0; j < COLUMNS; j = j + 1) {
            printf("%d ", matrix[i][j]);
            if (j == COLUMNS - 1)
                printf("\n");
        }
    }
    printf("\n");
}

int main() {
    int matrix[ROWS][COLUMNS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    };
    printMatrix(matrix);
}

1.您可以将int [4][3]视为int [4*3],但它是未定义的行为(UB),因为int[i]仅定义为i 0到3的读/写,以及在i = 4处形成地址。它碰巧对我有用。可以通过将矩阵的定义更改为int matrix[] = { ... };来消除UB(我更喜欢省略大小,在这种情况下将是12)。

#include <stdio.h>
#include <stdlib.h>

void printMatrix(int rows, int columns, int *matrix) {
    for (int i = 0; i < rows; i = i + 1) {
        for (int j = 0; j < columns; j = j + 1) {
            printf("%d ", matrix[columns * i + j]);
            if (j == columns - 1)
                printf("\n");
        }
    }
    printf("\n");
}

int main() {
    int matrix[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
    };
    int rows = sizeof matrix / sizeof *matrix;
    int columns = sizeof *matrix / sizeof **matrix;
    printMatrix(rows, columns, *matrix);
}

1.另一种选择是将matrix定义为指针数组,但这是另一回事(每行可以有不同数量的列)。

相关问题