我参与了C ++编码课程,今天我在与课程中的其他人讨论动态内存分配。他在回顾他以前的C ++课程(这是他第一次接受编程),他们会使用这样的东西来构建和使用数组:
#include <iostream>
int main(void) {
int x;
std::cin >> x;
int arr[x];
for (int i = 0; i < x; i++) {
int k;
std::cin >> k;
arr[i] = k;
}
for (int i = 0; i < x; i++) {
std::cout << "The value at arr[" << i << "] is " << arr[i] << std::endl;
}
return 0;
}
我编译了这个没有使用g ++接收任何编译错误,当我运行它(x的输入很小)时,输出完全符合预期。我将代码更改为C并使用gcc运行它并获得相同的结果。
为什么这样做?我们在编译时不知道数组大小,但是我们没有动态分配任何内存,我们仍然可以无误读/写。我的假设是操作系统会自动为堆栈分配一定数量的内存,我们只是依赖于某些内存尚未使用的事实,但我并不完全满意。如果它是安全的,为什么我们对未知大小的数组使用动态分配?如果它不安全,为什么编译器没有给我一个警告(或者是否需要添加一个特定的标志来查看此警告)?任何洞察这里实际发生的事情都将非常感激。