ganon
@ganon

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

staticについて

Q&A

以下のプログラムについて。
関数内のvにstaticをつけるだけでなぜうまく出力されるのでしょうか?よくわかりません。

#include <stdio.h>

int *getdata(void)
{
    static int v[] = { 10, 20, 30, 0 };
    return v;
    }
int main(void)
{
    int *p = getdata();
    while (*p != 0) {
    printf("%d\n", *p);
    p++;    
    }
}
0

2Answer

オブジェクトはそれぞれ寿命 (lifetime) があり、寿命を終えた後には使えません。

寿命を決定づけるオブジェクトの種類は記憶域期間 (storage durations) と呼ばれ、以下の四種類が規定されています。

  • static (静的)
  • thread (スレッド)
  • automatic (自動)
  • allocated (割付け)

質問の事例では static キーワードで修飾しなければ automatic に該当し、これは関数の終了と共に寿命を終えるという意味です。 寿命を終えたオブジェクトを参照しようとしたときの動作は未定義です。

static キーワードで修飾した場合は記憶域期間は static となり、これはプログラムの最初から最後まで生存するという意味になります。

1Like

ちょっとめんどくさい話になりますが,関数内のローカル変数は通常スタックという領域に確保され,関数を脱出するとそのメモリ領域が解放されるようになっています.したがって,(スタックにある)ローカル変数のアドレスをreturn等で公開することは,通常やってはいけない行為になります.

で,この挙動はstaticをつけることで,(スタック外に領域が確保され)ローカル変数の領域が解放されることなく保持できるというわけです.

staticな変数は初期化も一度きりなため乱用は推奨しません.

0Like

Your answer might help someone💌