C/C++数组和malloc、new使用差别

首先,强调malloc和new差别,malloc使用在c语言中,而在c++中多以new为主,两者对应的释放函数也存在差别free()和delete()。这里不对两者做重点分析,而对数组进行差异讲解。

问题:有了数组,为什么还需malloc和new呢?(问题的关键和核心)

答:
数组其实分为静态联编和动态联编。
所谓静态联编就是我们平时直接int arr[5];这种形式的,它会在程序编译时直接生成,开辟空间,也就导致了int length = 5; int arr[length];报错,识别length有误,因为编译阶段根本不知道length是啥,只是做好一些基础工作,在翻译阶段才会将所谓的关系进行链接,因此会length报错。
这个问题很大程度上限制了我们对于函数中动态数组的创建,比如,每次传入函数中的数组大小不同,如果我们每次都创建很大的数组,以保证数据不会溢出,这样的成本过于高,尤其是数组大小相差很大的时候,会造成内存浪费,那还有办法吗?
有!就是动态数组,如果我在程序运行过程中,再为数组开辟空间,它便可以识别传入的参数量。这也就是malloc()和new()函数的原理,利用函数在运行时创建数组,以保证对数组输入变量参数量的识别。int *p = new int[5];

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++中,通常使用new运算符来动态分配内存来创建数组。然而,如果你想使用malloc函数来创建数组,你可以按照以下几种方法之一进行操作: 方法一(nodes\[i\]为指针): ``` struct Node<int, int> **nodes = (struct Node<int, int>**)malloc(sizeof(struct Node<int, int>*) * n); for (size_t i = 0; i < n; i++) nodes\[i\] = (struct Node<int, int>*)malloc(sizeof(struct Node<int, int>) * n); ``` 这种方法创建了一个指向指针的指针数组,然后使用malloc函数为每个指针分配内存。 方法二(nodes\[i\]为指针): ``` struct Node<int, int> *nodes\[n\]; for (size_t i = 0; i < n; i++) nodes\[i\] = (struct Node<int, int>*)malloc(sizeof(struct Node<int, int>)); ``` 这种方法创建了一个指针数组,然后使用malloc函数为每个指针分配内存。 方法三(nodes\[i\]为结构体struct): ``` struct Node<int, int> *nodes = (struct Node<int, int>*)std::malloc(sizeof(struct Node<int, int>) * n); ``` 这种方法直接使用malloc函数为整个数组分配内存。 需要注意的是,使用malloc函数分配内存后,需要在不再使用使用free函数释放内存,以避免内存泄漏。另外,C++中更推荐使用new和delete来进行内存的动态分配和释放,因为它们提供了更好的类型安全性和异常处理机制。 #### 引用[.reference_title] - *1* *2* *3* [C/C++使用malloc为结构体数组分配内存(及free释放内存)的三种方法](https://blog.csdn.net/yihuajack/article/details/110882071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值