动态创建的二维char数组释放内存时程序崩溃的问题求助
问题分析与修复方案
导致崩溃的核心错误
你的lineArray[i]内存分配时用错了大小计算:
lineArray[i] = (char *)malloc(SIZE* sizeof(char*));
这里sizeof(char*)是指针的字节数(32位系统4字节,64位8字节),但你要分配的是char类型的数组,应该用sizeof(char)(固定1字节)。错误的分配大小会破坏堆内存结构,最终触发free时崩溃。
还有两个隐性错误
- 重复定义变量:
你连续两次定义了char **lineArray,这在C语言的同一作用域里是非法的,改成:char **lineArray = NULL; lineArray = malloc(count * sizeof(char*)); // 去掉前面的char ** - 未检查malloc返回值:
如果malloc失败返回NULL,后续访问lineArray或lineArray[i]会直接触发崩溃,必须加检查。
可能的其他崩溃诱因
- count值非法:如果
count是0或者负数,malloc(count * ...)会返回NULL(或0字节内存),循环里访问lineArray[i]就是越界操作。要确保count是正整数。 - strcpy越界:哪怕你觉得
strcpy没问题,也要确认line是以\0结尾的有效字符串。建议改用strncpy避免越界:strncpy(lineArray[i], line, SIZE-1); lineArray[i][SIZE-1] = '\0'; // 手动加终止符,防止strncpy不补\0
修正后的完整代码
内存分配与释放示例
#include <stdio.h> #include <stdlib.h> #include <string.h> const int SIZE = 128; int main() { int count = 10; // 替换成你的实际count值 char line[SIZE]; char **lineArray = NULL; // 分配指针数组 lineArray = malloc(count * sizeof(char*)); if (lineArray == NULL) { perror("Failed to allocate lineArray"); exit(EXIT_FAILURE); } // 分配每个字符串的内存 for (int i = 0; i < count; ++i) { lineArray[i] = malloc(SIZE * sizeof(char)); if (lineArray[i] == NULL) { // 分配失败时回滚已分配的内存,避免泄漏 perror("Failed to allocate lineArray[i]"); for (int j = 0; j < i; j++) { free(lineArray[j]); } free(lineArray); exit(EXIT_FAILURE); } } // 写入数据示例 strcpy(line, "test content"); for (int i = 0; i < count; ++i) { strncpy(lineArray[i], line, SIZE-1); lineArray[i][SIZE-1] = '\0'; } // 内存释放 for (int i = 0; i < count; i++ ) { free(lineArray[i]); } free(lineArray); lineArray = NULL; // 避免野指针 return 0; }
额外优化建议
用sizeof(*变量)代替固定类型的sizeof,代码更健壮,哪怕后续修改变量类型也不用改这部分:
lineArray = malloc(count * sizeof(*lineArray)); // 等价于sizeof(char*) lineArray[i] = malloc(SIZE * sizeof(*lineArray[i])); // 等价于sizeof(char)
内容的提问来源于stack exchange,提问作者Hayden Parker
相关产品推荐
相关产品推荐

