4

string_aこの例では、 variable が variableとして宣言されている 場合、どのような違いがありstaticますか?

const char *pString;
void first(void)
{
    const char string_a[] = " First string ";
    pString =(char *)string_a;
}
void second(void)
{
    const char string_b[] = " Second string ";
    pString =(char *)string_b;
}
int main()
{   
    first();
    second();
    printf("%s\n", pString);
}
  • C でオブジェクトの寿命を決定したのは何ですか?

  • 変数のグローバルスコープとファイルスコープの違いは何ですか?

4

4 に答える 4

4

staticここstaticでは、ファイル内のグローバル スコープ内と関数内の2 種類がありstaticます。

前者は、オブジェクトの内部リンケージを宣言します。つまり、ファイル内でのみアクセス可能です。これらのオブジェクトは、入る前にbssmain()で作成されます。そのメモリ領域は、実行memset前に常にすべてゼロになりmain()ます。

関数スコープ外で作成されたオブジェクトのデフォルトはグローバルextern(外部リンケージ) であり、キーワードを使用して他のコンパイル単位からアクセスできることを意味します。

static関数内とは、関数が最初に呼び出されてからプログラムが終了するまで、オブジェクトが存在することを意味します。

図:

int external_linkage;
static int internal_linkage;

void foo()
{
    static int static_in_function;
}

3 つの変数はすべて、スタック変数やヒープ変数とは異なり、プログラムの実行時に値を持つことが保証されています。0

于 2013-07-17T11:12:39.783 に答える
2

静的変数にfile scopeinternal linkage. これは、これらの変数が他の翻訳単位からアクセスできないことを意味します。

グローバル変数にもfile scopebut with がありexternal linkageます。これは、これらの変数が他の翻訳単位からもアクセスできることを意味します。

string_a は、関数内で定義されたローカル変数です。静的にすると、関数が呼び出されると存在し、プログラムが終了するまで存在します (一方、静的でないローカル変数は、関数が終了するとすぐに存在しなくなります)。

于 2013-07-17T11:10:16.963 に答える
0

externグローバルとは、キーワードを使用して別のファイルのその変数にアクセスできることを意味します。ファイルスコープとは、変数が他のファイルから見えないことを意味します。cでは、デフォルトですべてのグローバル変数にグローバルスコープがあります。グローバル変数を他のファイルから見えないようにしたい場合は、グローバル変数をstaticキーワードで定義します。staticキーワードは、グローバル スコープをファイル スコープに変換します。

于 2013-07-17T11:05:31.037 に答える
-1

関数内の静的変数はスコープに限定されます。これは、これらの変数は他の関数からアクセスできないことを意味しますが、ローカル変数とは異なり、スコープ後に破棄されず、プログラムの最後まで残ります


externグローバル変数にはファイル スコープがありますが、キーワードが使用されている場合、他のファイルからアクセスできます。staticファイル内のグローバル スコープでは、変数をファイルのみに限定します。

于 2013-07-17T11:13:06.243 に答える