做题出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相似,用于释放动态申请的空间,就不多说啦。