我已经使用C++几年了,今天我看到了一些代码,但这怎么能完全合法呢?
int main(int argc, char **argv)
{
size_t size;
cin >> size;
int array[size];
for(size_t i = 0; i < size; i++)
{
array[i] = i;
cout << i << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据海湾合作委员会编制.
如何在没有new或没有运行时确定大小malloc?
只是为了仔细检查,我用谷歌搜索了一些和我的所有类似的代码声称存储大小错误.
甚至Deitel的C++如何编程p.共同编程错误4.5下的261个状态:
只有常量可用于声明自动和静态数组的大小.
给我看.
我正在阅读有关动态内存分配和静态内存分配的内容,并找到了有关动态内存分配的内容:
在前面章节中看到的程序中,通过定义所需的变量,在程序执行之前确定所有内存需求.但是可能存在程序的内存需求只能在运行时确定的情况.例如,当需要的内存取决于用户输入.
所以我用C++编写了以下程序:
#include <iostream>
int main()
{
int n = 0;
int i = 0;
std::cout << "Enter size: ";
std::cin >> n;
int vector[n];
for (i=0; i<n; i++)
{
vector[i] = i;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个程序有效.我不明白它是如何工作的.什么时候确定尺寸?在这种情况下如何分配向量?
#include <iostream>
using namespace std;
int main(){
int n;
cout<<"Enter the size :";
cin>>n;
int array[n]; // I've worked some outputs and it works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是某种动态分配吗?
为什么它甚至没有给'n'作为"const"的错误?
此外,写入cout << array[n+5];不会导致编译时或运行时错误.
我正在使用Dev-C++.
必须在编译时知道数组维度,这意味着维度必须是常量表达式
另外一点是这样的
unsigned count = 42; // not a constant expression
constexpr unsigned size = 42; // a constant expression
Run Code Online (Sandbox Code Playgroud)
我会,然后期望以下声明失败
a[count]; // Is an error according to Primer
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.编译并运行良好.
还有一点奇怪的是,++count;在数组声明之后也没有引起任何问题.
用-std=c++11flag打开的程序g++4.71
这是为什么?
我正在阅读Lappman的"C++ Primer"一书.在第113页它说
数组中元素的数量是数组类型的一部分.因此,必须在编译时知道维度,这意味着维度必须是常量表达式.
此外,它说我们不能做这样的事情
unsigned cnt = 43; //not an const expression
string bad[cnt]; // error
Run Code Online (Sandbox Code Playgroud)
但事实并非如此,我编译它没有任何问题,我甚至可以做到这样的事情
int i;
cin >> i;
get_size(i);
void get_size(int size) {
int arr[size];
cout << sizeof (arr);
}
Run Code Online (Sandbox Code Playgroud)
它运行良好,为什么每本书都说在编译时必须知道数组大小?或者它必须是const表达式?
像这样的 C++教程说,所有数组的大小必须在程序运行之前确定.例如,这是不允许的:
cout << "How many variables do you want? ";
int nVars;
cin >> nVars;
int anArray[nVars]; // wrong! The size of the array must be a constant
Run Code Online (Sandbox Code Playgroud)
但这个简单的程序确实可以编译和执行.应该吗?
可能重复:
C/C++:运行时的数组大小是否允许动态分配?
在下面的清单中,显然大小buf由运行时常量决定j.编译器如何生成代码以在堆栈上分配存储(不知道j编译时的值)?
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
srandom(time(NULL));
int i = random();
cout<< "random number: "<<i<<endl;
if(i%2==0)
i=2;
else
i=1;
const int j=i;
char buf[j];
std::cout<<"size of buf array: "<<sizeof(buf)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)