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

动态创建的二维char数组释放内存时程序崩溃的问题求助

问题分析与修复方案

导致崩溃的核心错误

你的lineArray[i]内存分配时用错了大小计算:

lineArray[i] = (char *)malloc(SIZE* sizeof(char*));

这里sizeof(char*)是指针的字节数(32位系统4字节,64位8字节),但你要分配的是char类型的数组,应该用sizeof(char)(固定1字节)。错误的分配大小会破坏堆内存结构,最终触发free时崩溃。

还有两个隐性错误

  1. 重复定义变量:
    你连续两次定义了char **lineArray,这在C语言的同一作用域里是非法的,改成:
    char **lineArray = NULL;
    lineArray = malloc(count * sizeof(char*)); // 去掉前面的char **
    
  2. 未检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:45:29