總之,我想這樣做:如何正確地將從函數返回的const char *轉換爲C中的const char **?
const char **stringPtr = &getString();
不過,據我所知,你不能&上右值。所以我堅持這一點:
const char *string = getString();
const char **stringPtr = &string;
我可以住兩條線。我是否會爲這個黑客引入問題?我不應該害怕從它聲明的函數中傳遞stringPtr
,對吧?
編輯:我對最初不包括完整的上下文的道歉。 我已經開始使用OpenGL爲C語言編寫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);
}
該值被分配方式意味着,如果你給函數未初始化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);
}
編輯並添加了我想要完成的內容。基本上,我試圖重寫一個庫函數,通過const char **返回一個字符串,以包含一些更適合我的樣板初始化代碼。 – spirulence 2010-05-09 06:44:46