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

  • 相关阅读:
    VMware虚拟机网络桥接模式下无法与主机ping通解决办法
    (一)编写Bootloader程序应该注意的一些问题
    使用TrueSTUDIO和MDK编译器生成.bin文件
    Linux开发板通过串口与电脑上位机通信
    STM32知识点
    仿真器SWD可不接复位引脚的原因
    ARM内核常用缩写含义
    三大范式(转)
    修改主键示例
    ROW_NUMBER用法详解
  • 原文地址:https://www.cnblogs.com/luoyang0515/p/10529761.html
Copyright © 2020-2023  润新知