这是我先前问题的跟进。下面的简单代码可以打印矩阵,在我的家用电脑上没有任何错误或警告(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”以同样的方式对任意大的矩阵?
1条答案
按热度按时间myss37ts1#
1.代码是正确的,也是完成你想完成的事情的最直接的方法。我建议您删除
-Wvla
选项。1.您可以将其设置为编译时常量:
1.您可以将
int [4][3]
视为int [4*3]
,但它是未定义的行为(UB),因为int[i]
仅定义为i
0到3的读/写,以及在i = 4
处形成地址。它碰巧对我有用。可以通过将矩阵的定义更改为int matrix[] = { ... };
来消除UB(我更喜欢省略大小,在这种情况下将是12)。1.另一种选择是将
matrix
定义为指针数组,但这是另一回事(每行可以有不同数量的列)。