ローカル変数のポインタの戻り値の話

やはり前回の記事のファイルポインタのstaticの話がどうも納得できないので色々調べてみました。

ポインタ虎の巻〜スタックと自動変数
ローカル変数へのポインタを戻り値として返す関数について - 以下のコードは関数... - Yahoo!知恵袋

どこを見てもやっぱりデータを保持しているローカル変数へのポインタはおかしな値になるということは正しいようです。

char *sub(){
    char str[] = { "This is Wrong!" };
    return str;
}

void main(){
     // strは破棄されてるのでおかしなデータになる
     printf( "%s\n", sub() );
}

僕もこれはダメだということは認識しています。

で次の例

char *sub(){
    char *str = "This is Wrong!";
    return str;
}
void main(){
    // 正しく表示される
    printf( "%s\n", sub() );  
}

これはどこかに定義された文字列をstrというポインタ変数で受け取ってるだけなので、これを戻り値に返してもstrそのものは破棄されるけどデータは存在してるので正しく表示されるという認識でした。

ですが前回の記事でfopenで返されるファイルポインタはstaticで返さないといけないと書いてあったので混乱が生じました。

FILE *append_open(char *filename) {
    static FILE *fp;  /* 呼び出し側からアクセスするためstaticが必要 */
    
    fp = fopen( filename, "a" );  /* 追記モード */
    return fp;
}

これですね。fopenで生成されたファイルポインタはどこかに定義されたデータを保持してるだけなのでstaticをつけずとも戻り値として返せるはずです。

実際に試してみても、正しくオープンできてました。

というところで、これは僕がポインタについて勘違いしてるだけなのかどうか分からないのです。

非常に困りました。

やはり何かしらC言語の詳しい本を買うべきなんでしょうか。

欲しいのは欲しいんですが、最近いくつか本を買ってしまったため予算が・・・。

ということでもう少しWeb上で調べてみます。