什么是 "int (*arr)[cols]",其中 "cols" 是 C++ 中的变量?
What is "int (*arr)[cols]" where "cols" is a variable, in 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");
}
}
compile with gcc 11.2 -std=c++11
令我惊讶的是,这运行良好并且编译器没有报告任何警告。 AFAIK C++
has no VLA feature,我曾经认为应该禁止此代码。那为什么这行得通呢?
-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]
有关详细信息,请参阅 What compiler options are recommended for beginners learning C?。它是为 C 编写的,但同样适用于 g++。
我正在阅读
我注意到变量值 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");
}
}
compile with gcc 11.2 -std=c++11
令我惊讶的是,这运行良好并且编译器没有报告任何警告。 AFAIK C++
has no VLA feature,我曾经认为应该禁止此代码。那为什么这行得通呢?
-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]
有关详细信息,请参阅 What compiler options are recommended for beginners learning C?。它是为 C 编写的,但同样适用于 g++。