“表达式必须具有恒定值” visual studio错误E0028

时间:2019-11-21 12:51:44

标签: c visual-c++

#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]处显示此错误,为什么会发生此错误以及如何解决?声明动态数组是否是解决此问题的唯一方法,任何可能的解决方案都更容易?

2 个答案:

答案 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 );
...
相关问题