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

