动态内存分配异常:数组峰值存储时中间数据错乱
问题分析与修复方案
核心问题:内存分配错误导致数组越界
你的代码中每次调用realloc时都只分配了1个int的内存空间,但实际上当你要存储第count+1个峰值索引时,需要的内存大小是(count + 1) * sizeof(int)。
举个例子:
- 第一次
count=0时,malloc(1*sizeof(int))是合理的,数组长度为1,可正常存储peakBuffer[0]。 - 第二次
count=1时,你仍用realloc分配1个int的空间,数组长度还是1,但你却访问了peakBuffer[1]——这属于数组越界访问,会破坏内存中的原有数据,导致之前存储的峰值索引被覆盖成垃圾值。
其他次要问题
- 第一个循环块的
j边界错误:当count==0时,j < window的条件仅在i=0时有效,正确的边界应该是j < i + window,同时要限制不超过数组总长度,避免越界访问pArray。 - 输出注释混淆:你打印的是峰值索引(int类型),但printf里写的是
Peak = %d,容易误解,建议改为Peak index = %d更准确。 - 峰值初始化不合理:初始将
peak设为0.0,如果数组元素全为负数,会找不到正确的峰值,应该初始化为窗口内的第一个元素。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> int *findPeak(float *pArray, int length, int window, int *pCount) { int i, j, count = 0; float peak; int *peakBuffer = malloc(1 * sizeof(int)); if (peakBuffer == NULL) { // 检查内存分配是否成功 *pCount = 0; return NULL; } for (i = 0; i < length; i += window) { int end = i + window; if (end > length) { // 确保窗口不超出数组范围 end = length; } peak = pArray[i]; int peakIndex = i; // 遍历当前窗口找最大值(峰值) for (j = i; j < end; j++) { if (pArray[j] > peak) { peak = pArray[j]; peakIndex = j; } } // 扩容内存并存储峰值索引 if (count > 0) { int *temp = realloc(peakBuffer, (count + 1) * sizeof(int)); if (temp == NULL) { // 检查扩容是否成功,避免内存泄漏 free(peakBuffer); *pCount = 0; return NULL; } peakBuffer = temp; } peakBuffer[count] = peakIndex; printf("Peak index = %d\n", peakBuffer[count]); count++; } *pCount = count; printf("count = %d\n", count); for (i = 0; i < count; i++) { printf("%d, ", peakBuffer[i]); } printf("\n"); return peakBuffer; }
关键修复点说明
- 内存扩容逻辑修正:每次新增元素前,将内存扩容为
(count + 1) * sizeof(int),确保数组有足够空间存储新索引,彻底解决越界问题。 - 添加内存分配检查:
malloc和realloc都可能失败,检查返回值可避免空指针访问和内存泄漏。 - 窗口边界安全处理:计算窗口结束位置时限制在数组长度内,防止访问
pArray时越界。 - 峰值初始化优化:将
peak初始化为窗口第一个元素,确保即使数组全为负数也能找到正确峰值。
内容的提问来源于stack exchange,提问作者Rohith R
相关产品推荐
相关产品推荐

