c++ - 什么是“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");
}
}
令我惊讶的是,这很好用,编译器没有报告任何警告。AFAIKC++
没有 VLA 功能,我曾经认为应该禁止此代码。那么为什么这会奏效呢?
解决方案
-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++。
推荐阅读
- gradle - 如何将 Maven 配置文件转换为 gradle
- android - Android App - 将数据从互联网加载到广播接收器
- c# - 如何将列表中的对象传递给另一个控制器索引函数?
- raspberry-pi - cpufreq - 无法更改“scaling_available_frequencies”
- d3.js - 如何将svg的宽度和高度设置为等于它的g?
- c++ - 内存分配 wxWidgets
- typescript - Youtube iframe 需要不在我的打字稿定义中的属性
- angular - 单元测试 - Angular 6
- excel-formula - 总结所有新的动态行记录excel表
- java - Android Set不会删除arraylist中选中然后未选中的值