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

C语言链表节点是否会内存溢出?代码字符串过长异常求解

C语言链表内存溢出问题分析与解决

你的代码确实是内存溢出导致的崩溃,这类错误在C语言使用动态内存、柔性数组时十分常见。

核心问题原因

你定义的结构体中char plate[]是柔性数组成员,它本身不占用结构体的内存空间(sizeof(log)的计算结果不包含该数组的大小)。但你在init_lg函数里仅分配了sizeof(log)的内存,这意味着plate没有可用空间存储字符串。

当pl为"1234567"时,字符串(含终止符'\0')共8字节,刚好蹭到了内存分配对齐产生的“间隙”,暂时未触发崩溃;但当长度超过7时,strcpy会越界写入不属于当前节点的内存,直接破坏堆结构,导致后续内存操作(如malloc、链表遍历)异常,最终程序崩溃(进程码-1073740940对应Windows平台的堆损坏错误)。

解决方案

针对你的需求,有两种可靠的修复方式:

方式1:修正动态内存分配逻辑

在分配节点内存时,额外为plate计算并分配足够的空间(字符串长度+1,用于存储终止符),修改后的init_lg函数如下:

log* init_lg(long t, int st, char pl[])
{
    // 计算总内存:结构体基础大小 + 字符串长度 + 终止符空间
    size_t total_size = sizeof(log) + strlen(pl) + 1;
    log* p = (log*)malloc(total_size);
    if (p == NULL) { // 必须检查内存分配是否成功
        perror("malloc failed");
        return NULL;
    }
    p->time = t;
    p->status = st;
    strcpy(p->plate, pl);
    p->next = NULL;
    return p;
}

方式2:改用固定大小数组(若plate长度有明确上限)

如果题目规定了pl的最大长度(比如不超过15),可以直接将plate定义为固定大小数组,避免动态计算:

typedef struct log{
    struct log* next;
    long time;
    int status;
    char plate[16]; // 预留1字节存储终止符
}log;

此时init_lg中的malloc(sizeof(log))是有效的,但建议用strncpy替代strcpy,防止意外越界:

strncpy(p->plate, pl, sizeof(p->plate)-1);
p->plate[sizeof(p->plate)-1] = '\0'; // 强制添加终止符,确保字符串合法

额外注意事项

  • 链表使用完毕后,必须遍历所有节点并调用free释放内存,避免内存泄漏。
  • 永远要检查malloc的返回值,内存分配失败时会返回NULL,直接使用会引发空指针错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:51:33