初始化数组
回答
取决于你的“正确”的定义。
这就是所谓的变长数组(或只是VLA),它不是正式的C++的当前版本支持(100%确定为C++ 03之前,99.99%,确保了C++ 11),但它在C.
有些编译器允许将它作为编译器扩展。
0.01%在哪里? – texasbruce
@texasbruce - :)我还没有读新的标准。 _然而_。 :) –
这不是关于a是否是一个常量int。这是关于a是否具有在指定时间分配的初始值。编译器需要根据const int
值分配存储空间。 C++标准现在不支持可变长度数组。
在C99中,可变长度数组的这种语法是有效的,但C++标准说不。这是一个非常有用的功能,让所有毛茸茸的内存分配给编译器。
在GCC和Clang中,此功能作为编译器扩展支持,因此您不会收到任何警告和错误。但MSVC编译器会提示一条错误消息,说cannot allocate an array of constant size 0
,所以它是编译器特定的。
支持此功能的编译器可能已将您的代码转换为new
运算符。
int a;
cin>>a;
float *b = new float[a];
这在C++标准中有效。
另一件事是,虽然它被称为可变长度数组,但它根本不是长度可变的。一旦定义,其长度是一个永不改变的常数值。您无法展开或缩小它。
使用vector
容器真的好得多,它的确是长度变量,并且具有更多的可扩展性和自适应性。
查看Why aren't variable-length arrays part of the C++ standard?
- 1. 初始化数组时初始化System.AccessViolationException
- 2. 用数组或初始化初始化一个NSMutableArray初始化
- 3. 数组初始化
- 4. 数组初始化
- 5. 数组初始化
- 6. 初始化数组元
- 7. 初始化javascript数组
- 8. 从数组初始化Func
- 9. 数组初始化Java
- 10. 结构数组初始化
- 11. php数组初始化
- 12. 静态初始化数组?
- 13. C#初始化数组
- 14. f#:初始化数组
- 15. 初始化指针数组
- 16. 二维数组初始化
- 17. ASP.NET初始化数组
- 18. 初始化int数组
- 19. 初始化字符数组
- 20. Java数组初始化
- 21. C数组初始化
- 22. 字符数组初始化
- 23. 结构数组初始化
- 24. 初始化数组的值
- 25. 初始化数组正确
- 26. 数组初始化出错
- 27. 初始化结构数组
- 28. Java数组初始化
- 29. 初始化空数组
- 30. Swift 2.0数组初始化
这是一个编译器扩展后更多的讨论,虽然它是在一个TS即将到来。使用'-pedantic(-errors)'。 – chris
@chris请你详细说明,因为我是新手,并且不理解你的回复。我可以继续使用这种初始化进行编码吗? – Karthik
答案详细阐述了大部分内容。假设你使用的是GCC或Clang,你可以使用'-pedantic'来编译以获得警告,并且在2014年技术规范中,VLA将使用C++。 – chris