我有一个大学项目,在这里我必须创建一个库来处理来自终端的可执行文件的选项。
我创建了此struct 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,float,字符串或什么都不作为参数的函数。关键字是终端中选项的标识符,例如“ -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”。
我的代码可能是什么问题?
free()
函数不会清除内存,它只会从进程中释放内存,并让释放的空间可以自由地由另一个malloc()
重新分配。
这意味着,如果您尝试访问已释放的内存块,则可以找到您写入的最后一个值。但是,这只是幸运的情况,因为对已释放或未分配的内存区域的访问是不确定的行为。
此问题可以帮助您:How do malloc() and free() work?