C/C++ new和 malloc 常见的错误

  1.  新手小白常malloc和new常见的错误
  2. 定义malloc和new是完全不一样的
  3. malloc函数 是以字节为单位的 
  4. 以下代码出现了堆栈溢出的情况 一起来看一下
#include <iostream>

int main()
{
    /*整体小项目是 把一个新的元素 插入到 数组中 并且排序!*/

    //int a[10]{ 105,98,73,58,32,31,25,22,3,1 };     //初始数组从大到小排列

    int a[10]{ 1,3,22,25,31,32,58,73,98,105 };    //初始数组从小到大排列

    int acount = sizeof(a) / sizeof(a[0]);    //acount 用来记录 a 数组的元素个数

    int* aptr = (int*)malloc(sizeof(acount+1));    //动态内存分配
   
    int x;       //定义一个变量来接收新的值             
    
    std::cout << "输入新杀手的臭名值:";
    std::cin >> x;

    
   
    int getIndex{ -1 }; //记录要插入的下标

    if (a[0] > a[1])    //如果a[0]大于a[1] 就按从大到小排列
    {
        for (int i = 0; i < acount; i++)
        {
            if (x > a[i])
            {
                getIndex = i;
                break;
            }
        }
    }

    if (a[0] < a[1])    //如果a[0]小于a[1] 就按从小到大排列
    {
        for (int i = 0; i < acount; i++)
        {
            if (x < a[i])
            {
                getIndex = i;
                break;
            }
        }
    }

    if (aptr != nullptr)    //判断动态内存分配成功就执行以下代码
    {
        memcpy(aptr, a, getIndex * sizeof(int));

        memcpy(aptr + getIndex + 1, a + getIndex, (acount - getIndex) * sizeof(int));

        aptr[getIndex] = x;

        for (int i = 0; i <= acount; i++)
        {
            std::cout << aptr[i] << std::endl;    //打印输出 aptr
            
        }
        //std::cout << getIndex << std::endl;
    }
    
}

以上代码运行结果如下 堆栈溢出

 int acount = sizeof(a) / sizeof(a[0]);

这段代码是来计算 a数组有多少个元素

而这段代码 直接用 malloc sizeof(acount+1);

 int* aptr = (int*)malloc(sizeof(acount+1)); 

实际上malloc 只分配了5个字节的内存空间给你用

那么在 malloc 的定义中 是以字节为单位的 

而acount 是int数据类型 在sizeof的情况下 也就是 4个字节+1 等于5个字节 

而不是你需要的 内存值 所以会出现内存溢出

正确写法应该是 int* aptr =(int*)malloc(sizeof(int)*acount+1);

但是 new 就不会出现这种情况 比如下面代码

#include <iostream>

int main()
{
    //int a[10]{ 105,98,73,58,32,31,25,22,3,1 };

    int a[10]{ 1,3,22,25,31,32,58,73,98,105 };

    int acount = sizeof(a) / sizeof(a[0]);


    //std::cout << acount;

    //int* aptr = (int*)malloc(sizeof(acount+1));
    
    int* aptr=new int[acount+1];

在使用new的时候 是直接 new 一个 int类型的 内存区域 要分配 acount+1个内存区域

算了 不知道怎么写了 你们应该能看懂吧

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值