我总是使用这个malloc函数,例如,
int size = 10000;
int *a;
a = malloc(size * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
我最近遇到了丢弃该sizeof(int)部分的一段代码,即
int size = 10000;
int *a;
a = malloc(size);
Run Code Online (Sandbox Code Playgroud)
第二个代码似乎工作正常.
我的问题是,哪种形式是正确的?如果是第二种形式,我是否用第一种形式分配不必要的空间.
我正在慢慢将自己升级到c ++ 11.我看着constexpr并偶然发现这篇维基百科文章引导我"完全不同的东西".它给出的基本例子是:
int get_five() {return 5;}
int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++
Run Code Online (Sandbox Code Playgroud)
它声明"这在C++ 03中不合法,因为get_five()+ 7不是常量表达式." 并说,加入constexpr该get_five()声明解决了这个问题.
我的问题是"有什么问题?".我编译的代码既没有错误也没有警告.我玩它使它非常不稳定:
#include <iostream>
int size(int x) { return x; }
int main()
{
int v[size(5) + 5];
std::cout << sizeof(v) + 2 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
使用以下内容编译时没有任何投诉:
g++ -Wall -std=c++03
Run Code Online (Sandbox Code Playgroud)
并且在执行时我得到(正确的)答案42.
我承认我通常使用stl容器,而不是数组.但我认为(显然维基百科也是这样)上述代码的编译会失败.它为什么成功?