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

在函数中分配struct test双重指针内存出现垃圾值,求排查代码问题

内存分配错误引发的未定义行为问题分析

你的代码核心问题是指针数组的内存分配大小错误,直接导致内存越界的未定义行为,进而出现垃圾值输出。以下是具体问题拆解:

1. 致命错误:指针数组的内存分配尺寸不匹配

在main函数中,你需要分配一块能容纳10个struct test*类型指针的内存,但错误地使用了sizeof(struct test)来计算大小:

x=malloc(sizeof(struct test) * 10); // 错误写法
  • struct test的大小是4字节(仅包含一个uint32_t成员),而struct test*的大小取决于系统位数:32位系统是4字节,64位系统是8字节。
  • 以64位系统为例,你只分配了40字节,但实际需要80字节来存储10个指针。后续get_s函数中对指针数组的赋值操作会超出malloc分配的内存范围,触发内存越界访问——这属于C标准中的未定义行为,运行时会产生垃圾值、程序崩溃等不可预测的结果。
  • 正确的写法应该是:
    x = malloc(sizeof(struct test*) * 10);
    // 更安全的写法(避免重复类型名):
    x = malloc(sizeof(*x) * 10);
    

2. 次要问题:指针操作的可读性优化

get_s函数中的指针间接访问写法过于繁琐,容易出错,可以简化为数组式访问:
原代码:

*(*arr+i)=malloc(sizeof(struct test));
(*(*arr+i))->a=n;

简化后:

(*arr)[i] = malloc(sizeof(struct test));
(*arr)[i]->a = n;

这样的写法更符合数组访问的直觉,可读性更强,也不容易出现指针运算错误。

3. 补充:内存泄漏隐患

当前代码没有释放任何malloc分配的内存,虽然这不是导致当前垃圾值的原因,但在实际项目中必须补充释放逻辑,避免内存泄漏:

// 在main函数return前添加:
for(int i=0;i<10;i++){
    free(x[i]); // 先释放每个struct test实例的内存
}
free(x); // 再释放指针数组的内存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:24:26