4

重複の可能性:
非定数初期化子を使用したグローバル変数の定義

私はこのコードを持っています:

#include <stdio.h>
#include <stdlib.h>


int foo (int num, int i)
{
    static int* array = malloc(sizeof(int));  // ERROR HERE!!!
    printf("%d", array[i]);
    return 0;
}



int main(int argc, char *argv[])
{
    int i;
    for (i = 0; i < 2; i++) {
    foo(i, i);
    }

    return 0;
}

コードを ac ソース ファイルとして保存しましたが、動作しませんか? error prompt:_

gcc -O2 -Wall test.c -lm -o test
test.c:4:1: error: initializer element is not constant

Compilation exited abnormally with code 1 at Sat Jan 05 21:33:56

ただし、C++ ソース ファイルとして保存すると、問題なく動作します。なんで?誰か私に説明できる人はいますか?

4

4 に答える 4

3

staticC では、非定数初期化子を使用してオブジェクトを初期化することはできません。

static int* array = malloc(sizeof(int));

                    ^ must be a constant

C標準から:

(C99、6.7.8p4) 「静的な保存期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。」

于 2013-01-05T13:44:44.360 に答える
2

staticCおよびC++標準では、保存期間のあるオブジェクトの初期化の扱いが異なります。C ++では静的初期化(つまり定数による初期化)と動的初期化(つまり非定数式による初期化)の両方が許可されますが、Cでは静的初期化(つまり定数式による初期化)のみが許可されます。

C++標準の関連部分は6.7.4です。

静的ストレージ期間(3.7.1)のすべてのローカルオブジェクトのゼロ初期化(8.5)は、他の初期化が行われる前に実行されます。定数式で初期化された静的ストレージ期間を持つPODタイプ(3.9)のローカルオブジェクトは、そのブロックが最初に入力される前に初期化されます。[...]それ以外の場合、そのようなオブジェクトは、コントロールがその宣言を最初に通過するときに初期化されます。このようなオブジェクトは、初期化の完了時に初期化されたと見なされます。(強調を追加)

C ++では、初期化子の動的部分(つまり、の呼び出し)を1回だけ実行するために、追加の「簿記」が必要mallocです。C規格には、同様の「動的」規定はありません。

静的ストレージ期間を持つすべてのオブジェクトは、プログラムの起動前に初期化(初期値に設定)する必要があります。静的な保存期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。

同時実行性がない場合は、次のようにCで使用するコードを書き直すことができます。

int foo (int num, int i) {
    static int* array = NULL;
    if (!array) array = malloc(sizeof(int)); // No error
    printf("%d", array[i]);
    return 0;
}

これで、コードが「簿記」を担当します。つまり、割り当てを実行する前にチェックarrayします。NULL

于 2013-01-05T13:57:39.373 に答える
1

Cでは違法ですが、C ++ではOK、違います

代わりに次のように書くことができます:

static int* array = NULL;
if (array == NULL)
    array = malloc(sizeof(int));
于 2013-01-05T13:58:17.940 に答える
1

C (C++ とは異なり) では、静的期間変数を非定数値で初期化することはできません。

static int* array = malloc(sizeof(int));  // ERROR HERE!!!

C99 標準: セクション 6.7.8:

静的記憶域期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。

于 2013-01-05T13:46:33.373 に答える