アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の静的変数?についてA,Bのメモリは別でしょうか?
test関数外からBの変数を再度初期化できるのでしょうか?
staticの仕組みがわからないのでstaticのメモリの初期化のタイミングとメモリアクセス方法について知りたいです。

static x = 1; // ---A

int test()
{
static int x = 0; // --- B

}

またexternの働きも知りたいです。

A 回答 (3件)

>A,Bのメモリは別でしょうか?


別です。
>staticのメモリの初期化のタイミング
コンパイルした時点です。

つまり、実行時に変更すれば、次回その関数に入った時点で、前回変更した値が読み取られます。

>test関数外からBの変数を再度初期化できるのでしょうか?
Bは関数内で定義した変数なので、関数外からは原則、アクセスできません。「原則」といったのは、その変数を指すポインタなどを使ってアクセスできるからです。
以下、ポインタを使って関数外から変数にアクセスする例です。

int *test(void)
{
  static int x=1;
  printf("x=%d,",x);
  return &x;
}

int main(void)
{
  int *xp,i;
  xp = test();  // 変数のアドレスを取得
  for(i=0; i<10; i++) {
    (*xp)++;  // 外部から変数にアクセス
    test();   // アクセスされたことを確認する
  }
  return 0;
}
    • good
    • 0

関数外の static は「そのコンパイル単位 (= ソースファイル)」からのみアクセスできる」という意味で, 「そのコンパイル単位の最初の関数が実行される直前までのどこかの時点」で初期化される.


関数内の static は「関数が終わったあとでも値が保存される」という意味で, 初期化のタイミングは「最初にそこに来たとき」じゃないかな.
    • good
    • 0

> externの働きも知りたいです。



アプリケーションが複数のソースファイル(*.c)から
成り立っているとします。このとき、あるソースファイルに

extern int n;

のように書くと、どこか別のソースファイルで実体を定義(externを付けない)したnを
利用することになります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!