C语言使用struct结构体对象时报未初始化本地变量错误如何解决
错误原因
你定义的ntuple是struct ttype*的别名,属于指针类型。你在main中声明的ntuple obj只是创建了一个指针变量,没有给它赋值为任何有效的struct ttype类型内存的地址,直接传递给put函数使用就会触发未初始化变量的报错。
解决方法1:栈上分配结构体实例
直接在栈上声明一个struct ttype类型的变量,再把它的地址赋值给obj即可,示例代码如下:
// 注意要先定义MAX_ARITY,不然结构体编译也会报错,这里举个例子定义为10 #define MAX_ARITY 10 struct ttype { int arity; char* items[MAX_ARITY]; }; typedef struct ttype* ntuple; // 这里假设你已经实现了put函数,先声明避免隐式声明报错 void put(int a, char* b, ntuple c); int main() { struct ttype obj_inst; // 栈上分配结构体实例 ntuple obj = &obj_inst; // 指针指向合法内存地址 // 也可以直接在这里初始化结构体成员,避免后续使用野指针 obj_inst.arity = 0; for(int i=0;i<MAX_ARITY;i++) obj_inst.items[i] = NULL; put(0, "zubair", obj); return 0; }
解决方法2:动态堆内存分配
如果需要结构体的生命周期超出当前函数作用域,可以用malloc在堆上申请内存,使用完后记得free避免内存泄漏:
#define MAX_ARITY 10 #include <stdlib.h> struct ttype { int arity; char* items[MAX_ARITY]; }; typedef struct ttype* ntuple; void put(int a, char* b, ntuple c); int main() { ntuple obj = malloc(sizeof(struct ttype)); if(obj == NULL) { // 内存申请失败的异常处理逻辑 return 1; } // 初始化成员 obj->arity = 0; for(int i=0;i<MAX_ARITY;i++) obj->items[i] = NULL; put(0, "zubair", obj); // 使用完后释放内存 free(obj); return 0; }
内容的提问来源于stack exchange,提问作者Zubair Khan
相关产品推荐
相关产品推荐

