- 新手小白常malloc和new常见的错误
- 定义malloc和new是完全不一样的
- malloc函数 是以字节为单位的
- 以下代码出现了堆栈溢出的情况 一起来看一下
#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个内存区域
算了 不知道怎么写了 你们应该能看懂吧