-1

About the following code:

#include <stdio.h>

int lastval(void) 
{ 
   `static int k = 0; 
    return k++; 
}

int main(void)
{

   int i = 0;

   printf("I previously said %d\n", lastval());
   i++;
   i++;
   i++;
   i++;
   i++;
   printf("I previously said %d\n", lastval());
   i++;
   i++;
   i++;
   printf("I previously said %d\n", lastval());
   i++;
   i++;
   i++;
   printf("I previously said %d", lastval());
   i++;
   i++;
   i++;

   return 0;

}

can anyone explain to me how does static maintain its value ? I though it was because the stack frame for the function wasnt destroyed after the return so I wrote this code to run it under gdb and I after doing backtraces after every single line only main's stack frame show up (it doesnt even list lastval when I do a backtrace sitting on a printf call, but anyway).

How its k actually stored ? I know that's not like a normal variable since the first k++ returns 1 instead of 0, and its not like a global since i cant access k inside main for example, so .. what's going on ?

`on a local k, K++ // Always returns 0

`on a global k = 0, k++ // returns 0, 1, 2

`on a static k, k++ // returns 1, 2 ,3

Can anyone help me to understand these 2 issues ?

4

5 に答える 5

5

関数内の静的定義は、シンボルのスコープ以外の関数外の静的定義と同じです (プログラム内で参照できる場所)。スタック フレームとは関係ありません... k はスタック上になく、"static"/global/.data メモリにあります。

最初の k++ は 0 ではなく 1 を返すため、これは通常の変数とは異なります。

いいえ、0 を返しますが、k の値は 1 です。

static k, k++ // 1, 2 ,3 を返す

いいえ、それは正しくありません ... 0、1、2 が返されます ...

たとえば、メイン内のkにアクセスできないため、グローバルとは異なります

これが名前スコープの仕組みです。k の格納方法とは関係ありません。

于 2013-07-08T06:13:49.647 に答える
1

皮肉なことではありませんが、Cに関するリファレンスはこれを説明します

関数内の変数にstaticキーワードを使用すると、関数呼び出し間で値を保持できます。グローバルのように保存されますが、定義されている関数のスコープ内でのみ名前でアクセスできます。

static標準 C ライブラリの変数の典型的な使用方法のいくつかは、rand(3)およびの実装で発生しstrtok(3)ます。それらの使用は、再入可能でない関数につながる可能性があり、複数のスレッドが使用されているときに大混乱を引き起こす可能性があるため、一般的に推奨されていません。POSIX は、strtok_r再入可能性が必要な場合に使用する関数を定義しています。

于 2013-07-08T06:13:32.880 に答える
1

変数kは関数内で定義されているlastvalため、そのスコープはこの関数内のみです。ただし、staticキーワードで定義したため、その有効期間はプログラムの有効期間と同じになります。

したがって、 static の定義に従って、この変数kは一度だけ初期化され、最後の値が保持されます。それがあなたのケースで起こっていることです。初期化された静的変数はメモリ.dataのセクションに入ります。k.data

于 2013-07-08T06:14:43.487 に答える
1

スコープを除いて、グローバルとして格納されている静的変数。あなたのプログラムは私のコンピューターで 0 1 2 3 を出力するので、再確認してください。

于 2013-07-08T06:14:46.753 に答える
0

静的変数は、プログラムがメインの実行を開始する前に、(スタック フレームではなく) グローバル メモリ空間でインスタンス化されます。

C、その変数は、プログラムがメインの実行を開始する前に初期化されます。

C++、その変数は、プログラムがこの行に初めて遭遇したときに初期化されます。

「lastval()」関数を実行すると、その「static int k = 0」は再度実行されません。

于 2013-07-08T06:28:42.487 に答える