首页 > 解决方案 > 什么是“int (*arr)[cols]”,其中“cols”是 C++ 中的变量?

问题描述

我正在阅读这篇文章以考虑如何为二维数组动态分配内存。

我注意到变量值cols可以用作定义的大小int (*arr)[cols],因为C语言具有可变长度数组(VLA)功能,然后我尝试将代码修改为C++

#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>

void* allocate(size_t rows, size_t cols)
{
    int (*arr)[cols] = (int (*)[cols])malloc(rows *sizeof(*arr));
    memset(arr, 0, rows *sizeof(*arr));
    return arr;
}

int main() {
    size_t rows, cols;
    scanf("%zu %zu", &rows, &cols);

    int (*arr)[cols] = (int (*)[cols])allocate(rows, cols);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%3d", arr[i][j]);
        }
        printf("\n");
    }
}

编译gcc 11.2 -std=c++11

令我惊讶的是,这很好用,编译器没有报告任何警告。AFAIKC++ 没有 VLA 功能,我曾经认为应该禁止此代码。那么为什么这会奏效呢?

标签: c++cvariable-length-array

解决方案


-std=c++11不是“严格按照 C++11 编译”而是“启用 C++11 功能”。正如-std=gnu++11(默认设置)意味着启用 gnu++11 功能,它是 C++11 的超集。

要获得严格合规的行为,您必须使用-std=c++11 -pedantic-errors. 然后你得到这个:

error: ISO C++ forbids variable length array 'arr' [-Wvla]

请参阅为学习 C 的初学者推荐哪些编译器选项?详情。它是为 C 编写的,但同样适用于 g++。


推荐阅读