关键字new与malloc函数

做题出bug,OJ说我没有定义new。

纳尼?new还需要定义?不都是直接用的吗,明明在自己的编译器里都可以通过的!

编译器:劳资是C++....

一番倒腾后发现,我用的C++,但是OJ的编译器是C,所以不行。

原来C中是没有new的定义的,那么我们先找找new在哪里。

在VS2018_Community的头文件<vcruntime_new.h>中,我们可以看到很多new的代码,这里截取一小部分

 1 _Ret_notnull_ _Post_writable_byte_size_(_Size)
 2 _VCRT_ALLOCATOR void* __CRTDECL operator new(
 3     size_t _Size
 4     );
 5 
 6 _Ret_maybenull_ _Success_(return != NULL) _Post_writable_byte_size_(_Size)
 7 _VCRT_ALLOCATOR void* __CRTDECL operator new(
 8     size_t _Size,
 9     std::nothrow_t const&
10     ) noexcept;
11 
12 _Ret_notnull_ _Post_writable_byte_size_(_Size)
13 _VCRT_ALLOCATOR void* __CRTDECL operator new[](
14     size_t _Size
15     );
16 
17 _Ret_maybenull_ _Success_(return != NULL) _Post_writable_byte_size_(_Size)
18 _VCRT_ALLOCATOR void* __CRTDECL operator new[](
19     size_t _Size,
20     std::nothrow_t const&
21     ) noexcept;

看不懂?没事,我也不懂。

总的来说,new是C++所规定的关键字,虽然在一些头文件中有定义或重写,但实际上new是不依赖于头文件的。换句话说,只要你的编译器能编译C++代码,那就能用new。

而C不存在new的定义,这就导致了编译错误。

那我想在C里new怎么办?

new实际上就是动态分配空间,在C中可以用函数malloc()实现,其在头文件<stdlib.h>中。

1 void *malloc (size_t size);    //函数声明
2 x=(int) malloc(sizeof(a[10]);     //具体例子

因为规定为void函数指针,所以在应用时需要根据实际情况进行转型。参数为动态分配空间的大小,通常用sizeof确定。

C++中有new就有delete,那C呢?

C有malloc就有free,与delete相似,用于释放动态申请的空间,就不多说啦。

原文地址:https://www.cnblogs.com/luoyang0515/p/10529761.html