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
相关产品推荐
相关产品推荐

