C语言用void指针实现通用结构体动态分配触发编译报错如何解决
代码问题排查与修复方案
现有代码核心错误
- 首个编译报错的直接原因:
get_alloc_string参数类型错误。你传入的是char*类型的arr,*arr的类型是char,将malloc返回的void*指针直接赋值给char类型变量,自然触发类型转换报错。要修改指针本身的值,需要传入二级指针char**。 get_alloc_single_struct逻辑错误:把malloc返回值直接赋值给局部变量arr,修改的是函数栈上的临时变量,外部传入的结构体指针不会被实际赋值。同时当前写死了分配struct ads的大小,不符合“适配任意类型结构体”的要求。- 主函数调用逻辑错误:调用
get_alloc_single_struct时直接传入一级指针data1,无法拿到分配后的地址;分配完data1->title的内存后直接赋值字符串常量,会导致刚分配的内存泄漏,同时修改的是指针本身的指向,不是写入到分配的内存空间。 - 头文件不规范:
malloc的标准头文件是stdlib.h,非标准头malloc.h可移植性差。
修复后实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> struct ads{ int id; char *title; char *name; }; // 为字符串分配内存,传入二级指针修改外部char*变量的值 void get_alloc_string(char **arr, int n) { *arr = malloc(sizeof(char) * n); } // 通用结构体分配函数,传入二级指针和要分配的结构体大小 void get_alloc_single_struct(void **arr, size_t struct_size) { *arr = malloc(struct_size); } int main() { struct ads *data1 = NULL; // 分配结构体内存,传入data1的地址和struct ads的大小,适配任意结构体 get_alloc_single_struct((void**)&data1, sizeof(struct ads)); if (data1 == NULL) { return -1; } // 为title分配10字节内存 get_alloc_string(&data1->title, 10); if (data1->title == NULL) { free(data1); return -1; } // 字符串拷贝到分配的内存,不要直接赋值字符串常量 strncpy(data1->title, "fawad khan", 9); data1->title[9] = '\0'; // 手动加结束符保证安全 data1->id = 102; printf("%s %d\n", data1->title, data1->id); // 释放内存避免泄漏 free(data1->title); free(data1); return 0; }
修复说明
- 字符串分配函数改为接收
char**类型参数,通过解引用二级指针直接修改外部的char*变量的值,完成内存分配。 - 通用结构体分配函数新增
struct_size参数,调用时传入目标结构体的sizeof结果即可适配任意类型的结构体分配,不需要在函数内写死结构体类型。 - 所有内存分配后都增加空指针判断,避免内存分配失败触发野指针访问。
- 字符串赋值改用
strncpy写入到分配的内存空间,避免内存泄漏,同时手动补字符串结束符保证安全。 - 最后增加内存释放逻辑,避免堆内存泄漏。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

