堆上分配数组实现反转函数出错及动态内存释放咨询
问题分析与解决
一、反转后首元素丢失、出现垃圾值的原因
你的代码存在两个关键错误导致了该问题:
数组越界访问
在reverseArray的循环中,output[i] = arr[5 - i];这行代码逻辑错误:当i=0时,5-i=5,而你的数组array1下标范围是0到4,访问arr[5]属于越界读取,得到的是内存中的随机垃圾值;同时,原本的arr[0](值为10)永远不会被赋值到output中——当i=4时,5-4=1,只会取到arr[1](值为20)。
正确的写法应该是:output[i] = arr[4 - i];这样
i从0到4时,会依次取arr[4]、arr[3]、arr[2]、arr[1]、arr[0],正好完成数组反转。内存分配的类型不匹配
你用malloc(sizeof(int)*5)分配内存,但数组元素类型是unsigned。虽然多数系统中int和unsigned的字节大小相同,但规范写法应该匹配元素类型,避免潜在兼容性问题:unsigned *output = (unsigned*) malloc(sizeof(unsigned)*5);
修正后的reverseArray函数:
unsigned *reverseArray(unsigned *arr) { unsigned *output = (unsigned*) malloc(sizeof(unsigned)*5); for(unsigned i = 0; i < 5; ++i) output[i] = arr[4 - i]; return output; }
此时运行程序会输出正确的反转结果:50 40 30 20 10 。
二、动态内存的释放问题
- 必须手动释放内存,不会自动释放:
reverseArray中用malloc分配的是堆内存,堆内存的生命周期不受函数局部作用域限制——函数结束后,只是局部指针output被销毁,但它指向的堆内存仍然存在,不会自动回收。如果不手动释放,会造成内存泄漏。 - 注意释放方式:用
malloc分配的内存必须用free()释放,不能用C的delete——malloc/free是C标准库的内存管理函数,new/delete是C的操作符,两者不能混用。
所以在main函数的return 0;之前,需要添加:
free(array2);
内容的提问来源于stack exchange,提问作者osilverstone96
相关产品推荐
相关产品推荐

