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

