You need to enable JavaScript to run this app. C语言动态内存分配作业:释放内存触发Project.exe断点问题求解
优惠活动
大模型
产品
解决方案
定价
更多

C语言动态内存分配作业:释放内存触发Project.exe断点问题求解

动态内存分配报错修复方案

核心错误定位

  • 错误1:冗余malloc导致内存泄漏、空指针判断完全无效
    fillArray开头执行的*array = (char*)malloc(*pointer * sizeof(char));申请的内存从未被使用,造成内存泄漏;同时array是栈上的数组首地址,永远不可能为NULL,if (array == NULL)的判断完全失效,真正malloc失败时不会触发错误处理。
  • 错误2:全局索引j导致内存越界写入
    复制单词时复用全局变量j,会导致下一个单词的字符从之前的j位置开始写入,对应malloc分配的单词数组中前几个位置是未初始化的垃圾值,后续读取和释放时就会触发堆损坏断点。
  • 错误3:countCharacters函数存在无意义判断
    if (string[index] == ' '&& index<= *pointer) index++;里的index<= *pointer完全多余,*pointer是单词数,和字符串下标index没有关联,容易引发索引偏移错误。
  • 错误4:未按作业要求实现数组动态扩容逻辑
    直接使用栈上的char* array[10],没有根据实际单词数通过malloc调整数组容量的步骤,不符合作业要求。

修复后完整可运行代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void fillArray(char string[], char* array[], int wordCount);
int countWordLength(char string[], int startIndex);
void freeArray(char* arr[], int size);

int main()
{
    char string[] = "i have two dreams";
    printf("Your sentence is: %s\n", string);
    // 统计实际单词数
    int wordCount = 1;
    for (int i = 0; string[i] != '\0'; i++)
    {
        if (string[i] == ' ') wordCount++;
    }
    // 按作业要求先定义大小为10的指针数组
    char* array[10] = {0};
    fillArray(string, array, wordCount);
    printf("\n\nYour array is: \n");
    for (int i = 0; i < wordCount; i++) puts(array[i]);
    freeArray(array, wordCount);
    return 0;
}

void fillArray(char string[], char* array[], int wordCount)
{
    int strIndex = 0;
    for (int i = 0; i < wordCount; i++)
    {
        // 跳过单词间的空格
        while (string[strIndex] == ' ') strIndex++;
        int wordLen = countWordLength(string, strIndex);
        // 为每个单词独立分配含\0存储位置的内存
        array[i] = (char*)malloc(sizeof(char) * wordLen);
        if (array[i] == NULL)
        {
            printf("--NO MEMORY--");
            exit(1);
        }
        // 复制单词内容(自动包含末尾的\0)
        for (int j = 0; j < wordLen; j++)
        {
            array[i][j] = string[strIndex + j];
        }
        // 移动字符串下标到下一个单词的起始位置
        strIndex += wordLen - 1;
    }
}

int countWordLength(char string[], int startIndex)
{
    int len = 1; // 预留\0的存储空间
    for (int i = startIndex; string[i] != ' ' && string[i] != '\0'; i++)
    {
        len++;
    }
    return len;
}

void freeArray(char* arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        free(arr[i]);
        arr[i] = NULL;
    }
}

关键修正说明

  • 移除了完全无用的首次malloc,消除内存泄漏,修正了空指针判断的逻辑错误
  • 每个单词复制时使用独立的局部索引,避免全局变量j导致的越界写入
  • 简化了单词长度统计函数的逻辑,移除了无关判断
  • 所有malloc分配的内存都被对应指针正确跟踪,释放时不会触发堆损坏断点

内容的提问来源于stack exchange,提问作者AlexLevitin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 10:06:04