这个问题紧接着这个问题:C 中是否有一种语法可以直接初始化一个结构成员,该结构成员是常量文字的 const 数组?.
Eric Postpischil 给了我一个使用复合文字的解决方案。
现在,我想在函数中初始化变量。但是,在函数内部,复合文字具有自动存储期限,并且在该函数外部需要数据。为了解决这个问题,我使用了
static
关键字,但我不确定这是一个好主意。
这是初始代码(主要是初始化)
#include <stdio.h>
typedef struct {
const char* name;
const int nb;
const char* const* list;
} valid_options_t;
void print_options (const valid_options_t* option) {
printf("Option Name : %s\n",option->name);
for (int i=0; i < option->nb; i++) printf("\t%s\n",option->list[i]);
printf("---------\n");
}
int main() {
const valid_options_t my_size_opts = {.name="size", .nb=3, .list= (const char * const[]) {"large", "medium", "small"} };
const valid_options_t my_color_opts = {.name="color", .nb=4, .list= (const char * const[]) {"orange", "yellow", "white", "red"} };
const valid_options_t my_form_opts = {.name="shape", .nb=2, .list= (const char * const[]) {"circle", "square"} };
print_options (&my_size_opts);
print_options (&my_color_opts);
print_options (&my_form_opts);
}
以及在函数中初始化的代码。
#include <stdio.h>
typedef struct {
const char* name;
const int nb;
const char* const* list;
} valid_options_t;
void print_options (const valid_options_t* option) {
printf("Option Name : %s\n",option->name);
for (int i=0; i < option->nb; i++) printf("\t%s\n",option->list[i]);
printf("---------\n");
}
void init_coumpond_literal(valid_options_t *(*my_opts)[3]) {
(*my_opts)[0] = &(static valid_options_t){.name="size", .nb=3, .list= (static const char * const[]) {"large", "medium", "small"} };
(*my_opts)[1] = &(static valid_options_t){.name="color", .nb=4, .list= (static const char * const[]) {"orange", "yellow", "white", "red"} };
(*my_opts)[2] = &(static valid_options_t){.name="shape", .nb=2, .list= (static const char * const[]) {"circle", "square"} };
}
int main() {
const int feature_nb=3;
valid_options_t *my_size_opts[feature_nb];
init_coumpond_literal(&my_size_opts);
for (int i=0; i < feature_nb; i++)
print_options (my_size_opts[i]);
}
这样做的方法正确吗?我怎样才能释放这些变量?
当在 init_coupound_literal 函数中使用 static 创建具有静态存储持续时间的对象时,在这种情况下并不理想。为什么:
内存泄漏:该函数创建静态对象并将其地址分配给 my_size_opts,但无法释放内存。这会导致内存泄漏。
可读性:由于使用嵌套指针和双重间接寻址,代码的可读性变得较差。