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

问题描述 投票:0回答:1

这是对我之前的问题的跟进。以下打印矩阵的简单代码在我的家用计算机(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 编译器)上使用它时,出现错误:

||=== 构建:在测试中调试(编译器:LLVM Clang 编译器)===|

...|5|错误:使用了可变长度数组 [-Werror,-Wvla]|

...|5|错误:使用了可变长度数组 [-Werror,-Wvla]|

...|7|错误:使用了可变长度数组 [-Werror,-Wvla]|

...|7|错误:使用了可变长度数组 [-Werror,-Wvla]| ||=== 构建 失败:4 个错误,0 个警告(0 分钟,0 秒)===

据我所知,这个错误是对“矩阵[行][列]”使用可变长度的抱怨。你能告诉我如何解决这个错误,这样我仍然可以以同样的方式对任意大的矩阵使用“printMatrix”吗?

arrays c multidimensional-array compiler-errors
1个回答
0
投票

代码很好所以我建议你删除

-Wvla
选项。

你可以让它成为编译时常量:

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

这对我也适用,但我认为这在技术上是未定义的行为,因为您假设定义范围之外的列访问有效(0 到 3 用于读取;4 用于比较,即超过数组)。如果您想确保它有效,请在

main()
.

中定义您的矩阵
#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);
}

另一个选项是将

matrix
定义为指针数组。

© www.soinside.com 2019 - 2024. All rights reserved.