c语言中malloc函数和new关键字的作用与用法

本文深入探讨了嵌入式系统中的内存管理问题,特别是局部变量与动态分配的区别。通过具体代码示例,分析了常见错误,如返回局部变量的地址、向无效内存写入,以及指针未初始化的问题。同时,对比了malloc与new在堆区分配内存的不同,强调了正确使用的重要性。
摘要由CSDN通过智能技术生成

最近在牛客网在做嵌入式笔试题,遇到new关键字,以下是我的总结。局部变量存放在栈中,在函数结束后自动释放。下面这题是一道嵌入式面试题一部分,找出以下错误。

    #incude <stdio.h>
    void *get1()
  {
    char buf[12]={"abc"};
    return buf;
  }
    int main()
  {
      int *m;
      m=get1();
      memcpy(m,"aaa",3);
      return 0;
  }

1.首先get1函数里的数组是局部变量,存放在栈区,对应的内存在函数结束时就会被释放。因此返回的地址是无效的。调用这样的地址是严重错误的。
2.调用memcpy(m,“aaa”,3),向没有权限的无效内存空间存放数据是非法的。
3.指针最好初始化,野指针容易出现非法访问。
malloc
动态内存分配函数,经常用在为数组申请动态内存空间,分配一块连续的内存。在堆上进行动态内存分配,由程序员自己释放,free函数释放。

       int *array=(int *)malloc (sizeof (int) *100)
       //返回是int*类型,内存空间大小100个整型数据
       int *array =(int *)malloc (1)
      //  申请了一个字节的空间,如果向里面存放了一个整数的话
      程序运行会报错
      int *p;
     p = malloc(sizeof(int));
     //若 malloc的返回是void *; ;则将void *转化给了int *,这不合理

new
new在堆上进行分配动态内存,用于C++中,由程序员自己释放,删除数组delete []p,指针释放后,要将指针置空。

    int *p;
    p = new int;   //返回类型为int *类型,分配的大
  小为  sizeof(int) 
  p = new int[100];    //返回类型为int *
类型,分配的大小为sizeof(int) * 100100int字节
### 回答1: 对于您的问题,我可以回答。C++ new 操作符底层实现是使用 malloc 函数来实现的,但 new 操作符还会进行一些额外的工作,如调用构造函数,对于内置类型和非内置类型, new 操作符的行为也有所不同。需要注意的是,对于内存分配和释放,应该始终使用匹配的 new 和 delete 操作符。 ### 回答2: C语言的`new`操作符并不是标准C语言的一部分,它通常是C++语言用来申请动态内存的运算符。在C++,`new`操作符在底层使用的是由C++标准库提供的`malloc`函数来实现动态内存的申请。 虽然`new`操作符和`malloc`函数都可以用来申请动态内存,但它们的行为有一些不同之处。其一个主要区别是`new`操作符可以自动调用对象的构造函数,而`malloc`函数仅仅是分配内存而已,不会执行构造函数。另外,`new`操作符还可以根据需要动态调整分配的内存大小,并且在内存不足时抛出`std::bad_alloc`异常。 当使用`new`操作符申请内存时,它首先会根据所需的内存大小调用全局的`operator new`函数(也是由C++标准库提供),然后再在分配的内存区域上调用对象的构造函数。因此,`new`操作符底层使用的是`malloc`函数来分配内存,然后再调用构造函数。 需要注意的是,在C语言使用`malloc`函数分配内存时,不会自动调用构造函数。如果要在C语言模拟`new`操作符的功能,需要手动调用构造函数来初始化对象。 ### 回答3: 在C语言,使用new操作符进行内存分配时,并非底层使用malloc函数来实现的。事实上,new操作符是C++语言用于动态分配内存的关键字,而不是C语言关键字。 在C语言,我们通常使用malloc函数来进行动态内存分配。这个函数用于在堆内存(heap)分配一块指定大小的内存空间,并返回一个void类型的指针。malloc函数的底层实现是由C标准库提供的。 C++语言new操作符与C语言malloc函数类似,用于动态分配内存。但与malloc函数不同的是,new操作符在底层实现时会调用malloc函数来获取内存空间。此后,new操作符还会调用构造函数来初始化分配的内存。 总结来说,C语言使用malloc函数进行内存分配,而C++语言使用new操作符进行内存分配。虽然new操作符在底层实现时使用了malloc函数,但从语法和用法上来看,它们是不同的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值