在函数中分配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
相关产品推荐
相关产品推荐

