#define max 40
...
void transpose(int matrix[][max], int* row, int* col)
{
int data[*row][max]; //expression must have a constant value at *row.
for (int i = 0; i < *row; i++)
{
for (int j = 0; j < *col; j++)
{
data[i][j] = matrix[i][j];
}
}
int _col = *row; //this *row works fine.
*row = *col; //also this *row works fine.
*col = _col;
for (int i = 0; i < *row; i++) //this *row is fine too.
{
for (int j = 0; j < *col; j++)
{
matrix[i][j] = data[j][i];
}
}
}
int main()
{
...
if (...)
{
int row = 0, col = 0;
int matrix[30][max];
if (FunctionReadFile(Parameters[0], matrix, &row, &col))
{
...
transpose(matrix, &row, &col);
...
}
...
}
...
return 0;
}
我尝试将'const'放在int之前,但它仍在[* row]处显示此错误,为什么会发生此错误以及如何解决?声明动态数组是否是解决此问题的唯一方法,任何可能的解决方案都更容易?
答案 0 :(得分:4)
您的编译器不支持VLA:s,因此您应该使用动态分配:
void transpose(int matrix[][max], int* row, int* col)
{
// Parenthesis matters. This is a pointer to array of size max. Without
// the parenthesis, it would be an array of pointers to int.
int (*data)[max] = malloc(max * sizeof (*data));
for (int i = 0; i < *row; i++)
{
for (int j = 0; j < *col; j++)
{
data[i][j] = matrix[i][j];
}
}
free(data);
}
请注意,我没有检查分配是否失败。您可以通过简单的检查来做到这一点。如果指针为NULL,则分配失败。另外,请记住在完成显示操作后释放内存,如图所示。
答案 1 :(得分:0)
您可以在MSVC中使用_alloca()
或_malloca()
进行堆栈分配。
返回值
_alloca
例程返回一个指向已分配空间的空指针, 保证适当对齐以存储任何类型的 宾语。如果size为0,则_alloca
分配零长度的项,然后 返回指向该项目的有效指针。如果空间不能满足,则会生成堆栈溢出异常 已分配。堆栈溢出异常不是C ++异常。它是 结构化异常。您无需使用C ++异常处理, 必须使用结构化异常处理(SEH)。
备注
_alloca
从程序堆栈分配大小字节。已分配 调用函数退出时(而不是当 分配只是超出范围)。因此,请勿通过_alloca
返回的指针值作为free
的参数。在异常中显式调用
_alloca
有一些限制 处理程序(EH)。在x86级处理器上运行的EH例程在 自己的内存框架:他们在内存空间中执行任务 不是基于当前堆栈指针的位置 封闭功能。 ...
例如:
void transpose(int matrix[][max], int* row, int* col)
{
int ( *data )[ max ] = _alloca( max * sizeof( *data ) );
for (int i = 0; i < *row; i++)
{
for (int j = 0; j < *col; j++)
{
data[i][j] = matrix[i][j];
}
}
...
或者,使用_malloca()
,这要求您致电_freea()
:
void transpose(int matrix[][max], int* row, int* col)
{
int ( *data )[ max ] = _malloca( max * sizeof( *data ) );
for (int i = 0; i < *row; i++)
{
for (int j = 0; j < *col; j++)
{
data[i][j] = matrix[i][j];
}
}
...
_freea( data );
...