我如何在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