在函数内使用复合文字来初始化 C 中的变量

问题描述 投票:0回答:1

这个问题紧接着这个问题: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]);
}

这样做的方法正确吗?我怎样才能释放这些变量?

arrays c struct compound-literals
1个回答
1
投票

当在 init_coupound_literal 函数中使用 static 创建具有静态存储持续时间的对象时,在这种情况下并不理想。为什么:

内存泄漏:该函数创建静态对象并将其地址分配给 my_size_opts,但无法释放内存。这会导致内存泄漏。

可读性:由于使用嵌套指针和双重间接寻址,代码的可读性变得较差。

© www.soinside.com 2019 - 2024. All rights reserved.