简而言之,我想这样做:
const char **stringPtr = &getString();
但是,我知道您不能 & on rvalues。所以我坚持这个:
const char *string = getString();
const char **stringPtr = &string;
我可以忍受两条线。我是否在介绍此 hack 的问题?我不应该害怕传递stringPtr
出它声明的函数,对吧?
编辑:我很抱歉最初没有包括完整的上下文。我已经承担了暑期项目,即使用 OpenGL 进行图形从头开始用 C 语言构建视频游戏。我正在使用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);
}
分配值的方式意味着,如果您给函数一个 uninitialized value
,它会尝试取消对未定义垃圾的引用,这几乎总是会导致我出现段错误。我目前针对此问题的解决方法是先初始化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);
}