Короче говоря, я хотел бы сделать это:Как правильно преобразовать const char *, возвращаемый функцией, в const char ** в C?
const char **stringPtr = &getString();
Однако, я понимаю, что вы не можете & на rvalues. Поэтому я застрял в этом:
const char *string = getString();
const char **stringPtr = &string;
Я могу жить с двумя линиями. Я представляю проблемы с этим взломом? Я не должен был опасаться пропустить stringPtr
из функции, о которой она заявлена, не так ли?
Редактировать: Мои извинения не изначально, включая полный контекст. Я взял летний проект по созданию видеоигры с нуля в C, используя OpenGL для графики. Я читаю данные конфигурации из текстового файла, используя libconfig.
Одним из удобных функций для нахождения определенной строки из файла конфигурации выглядит следующим образом:
int config_setting_lookup_string(const config_setting_t *setting,
const char *name, const char **value)
{
config_setting_t *member = config_setting_get_member(setting, name);
if(! member)
return(CONFIG_FALSE);
if(config_setting_type(member) != CONFIG_TYPE_STRING)
return(CONFIG_FALSE);
*value = config_setting_get_string(member);
return(CONFIG_TRUE);
}
Способ, которым присваивается значение означает, что если вы даете функцию неинициализированная value
, он пытается derefence undefined мусор, который почти всегда вызывает у меня segfault. Мой текущий обходной путь для этой проблемы заключается в инициализации value
другому указателю первой, например, так:
const char *dummyPtr;
const char **fileName = &dummyPtr;
config_setting_lookup_string(foo, "bar", fileName);
Так что я пытаюсь выяснить, лучший способ переписать последнюю часть функции, так что у меня не будет для выполнения этой двухступенчатой инициализации. Я думал, что измененная функция будет выглядеть так:
int config_setting_lookup_string(const config_setting_t *setting,
const char *name, const char **value)
{
config_setting_t *member = config_setting_get_member(setting, name);
if(! member)
return(CONFIG_FALSE);
if(config_setting_type(member) != CONFIG_TYPE_STRING)
return(CONFIG_FALSE);
const char *string = config_setting_get_string(member);
value = &string;
return(CONFIG_TRUE);
}
Отредактировано и добавлено полное контекст того, что я пытаюсь сделать. В принципе, я пытаюсь переписать библиотечную процедуру, которая возвращает строку через const char **, чтобы включить некоторый код инициализации шаблона, который мне подходит лучше. – spirulence