我如何在C中释放这个结构?
我有一个用于大学的项目,我必须创建一个库来处理来自终端的可执行文件的选项。
我创建了这个结构options_s:
typedef struct option_s option_t;
struct option_s {
char* keyword;
enum {
OptVoid,
OptInt,
OptString,
OptFloat
} spec;
union {
void (*opt_void)();
void (*opt_int)(int);
void (*opt_str)(const char*);
void (*opt_float)(float);
} fct;
option_t* next;
};
每个选项类型变量都将包含一个函数,该函数接受int、浮点数、字符串或nothing作为参数。关键字是终端中选项的标识符,例如是"-o“,并且在将被传递给函数的值之前。
这是我初始化一个以和int作为参数的选项的方法:
option_t* c_null(option_t* l, const char* kw){
l = (option_t*) malloc (sizeof(option_t));
l->keyword = (char*) malloc (strlen(kw) + 1);
strcpy(l->keyword, kw);
l->next = NULL;
return l;
}
option_t* common(option_t* l, const char* kw){
while(l->next != NULL) l = l->next;
l->next = (option_t*) malloc (sizeof(option_t));
l->next->keyword = (char*) malloc (strlen(kw) + 1);
strcpy(l->next->keyword, kw);
l->next->next = NULL;
return l->next;
}
option_t* opt_int(option_t* l, const char* kw, void (*f)(int)){
if(l == NULL){
l = c_null(l, kw);
l->spec = OptInt;
l->fct.opt_int = f;
return l;
}else{
option_t* o = common(l, kw);
o->spec = OptInt;
o->fct.opt_int = f;
return l;
}
}
我在释放选项时遇到了问题。为此,我编写了这个函数:
void opt_delete(option_t* l){
if(l->next != NULL) opt_delete(l->next);
free(l->keyword);
free(l);
}
这似乎不管用。即使在通过这个函数运行了一个接受字符串的选项之后,执行opt->fct.opt_str("foo");
仍然会输出"foo“。
我的代码中可能存在什么问题?
转载请注明出处:http://www.intsu.net/article/20230521/1520065.html