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

Valgrind报malloc时Invalid write of size 8错误原因求解

错误核心原因

你的代码在为struct char_ctx类型的指针申请内存时存在类型大小匹配错误:
你写的malloc(sizeof(struct char_ctx*))申请的是结构体指针的大小,而非结构体本身的大小。

  • 64位Linux环境下指针大小固定为8字节,所以你只为ctx指向的内存申请了8字节空间
  • struct char_ctx的实际大小为16字节:包含4字节的int成员、4字节的对齐填充位、8字节的char**成员,总大小16字节
  • 给ctx->char_array赋值时,写入的地址刚好超出了你申请的8字节内存范围,所以Valgrind报Invalid write of size 8,错误描述里的Address 0x522f048 is 0 bytes after a block of size 8 alloc'd完全匹配这个越界写场景。
常见疑问解答

为什么给char **y分配内存的代码没有报错?

y的内存分配逻辑完全正确:你申请了100个char*大小的内存,赋值给独立的二级指针变量y,不存在越界访问问题,所以Valgrind不会报错。

为什么代码还能正常执行?

这是C语言的未定义行为:你越界访问的内存地址刚好没有被其他程序占用、也没有触发系统的内存访问保护,所以程序暂时可以运行,但随时可能出现崩溃、数据污染等问题。

修复方案

把struct char_ctx *ctx = malloc(sizeof(struct char_ctx*));修改为以下任意一种正确写法即可:

// 写法1:直接指定结构体类型
struct char_ctx *ctx  = malloc(sizeof(struct char_ctx));
// 写法2:更安全的通用写法,不需要手动匹配类型,修改指针类型时不需要同步改sizeof参数
struct char_ctx *ctx  = malloc(sizeof(*ctx));

内容的提问来源于stack exchange,提问作者Nabz C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:54:01