要するに、私はこれをしたいと思います:
const char **stringPtr = &getString();
ただし、右辺値に & を使用できないことは理解しています。だから私はこれにこだわっています:
const char *string = getString();
const char **stringPtr = &string;
2行で生活できます。このハックで問題が発生していますか? stringPtr
宣言されている関数から抜け出すことを恐れる必要はありませんよね?
編集: もともと完全なコンテキストを含めていなかったことをお詫びします。私は、グラフィックに OpenGL を使用して C でゼロからビデオ ゲームを構築するという夏のプロジェクトを引き受けました。libconfigを使用して、テキスト ファイルから構成データを読み取っています。
構成ファイルから特定の文字列を見つけるための便利な関数の 1 つは、次のようになります。
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
に uninitialized を指定すると、未定義のガベージを逆参照しようとすることを意味します。これにより、ほとんどの場合、segfault が発生します。この問題に対する私の現在の回避策はvalue
、次のように、最初に別のポインターに初期化することです。
const char *dummyPtr;
const char **fileName = &dummyPtr;
config_setting_lookup_string(foo, "bar", fileName);
そのため、この 2 段階の初期化を実行する必要がないように、関数の最後の部分を書き直す最善の方法を見つけようとしています。変更された関数は次のようになると考えていました。
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);
}