You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态内存分配异常:数组峰值存储时中间数据错乱

问题分析与修复方案

核心问题:内存分配错误导致数组越界

你的代码中每次调用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]——这属于数组越界访问,会破坏内存中的原有数据,导致之前存储的峰值索引被覆盖成垃圾值。

其他次要问题

  1. 第一个循环块的j边界错误:当count==0时,j < window的条件仅在i=0时有效,正确的边界应该是j < i + window,同时要限制不超过数组总长度,避免越界访问pArray。
  2. 输出注释混淆:你打印的是峰值索引(int类型),但printf里写的是Peak = %d,容易误解,建议改为Peak index = %d更准确。
  3. 峰值初始化不合理:初始将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:24:28