这是对我之前的问题的跟进。以下打印矩阵的简单代码在我的家用计算机(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”吗?
代码很好所以我建议你删除
-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
定义为指针数组。