10

C で malloc を使用して静的変数 (関数内) を開始しようとしていますが、「initializer not constant エラー」が発生しています。Cで非定数で静的を開始できないことは知っていますが、解決策を考えられる人はいますか? これと同じ効果を得るには、コードが必要です。

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

トリック/回避策はありますか?

編集:フラグが高くなるたびに呼び出される関数があります。この関数では、新しいスレッドを作成して開始しています。構造体へのポインターを宣言し、malloc を使用してメモリを割り当て、このポインターをスレッドに渡します。その後、関数は制御を返します。関数を再入力すると、最初に開いたスレッドがまだ実行されているため、最初にスレッドに渡したメモリ領域にアクセスできるようにしたいと考えています。そのため、最初の呼び出しで malloc し、その後の呼び出しで同じアドレスを使用できるように、静的が必要です。このようにして、スレッドから情報を取得できます。これはすべて、グローバル変数の使用を避けるためです。

4

5 に答える 5

21
static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));
于 2013-05-23T22:40:18.870 に答える
9

関数静的変数が必要であると仮定します。

int foo(void) {
    static int b=1;
    static int *p;
    if (b) {
        p =  malloc(sizeof(int));
        b = 0;
    }
    ...
}

最初の呼び出しの後に決してないことがわかっている限り、チェックとして p に NULL 値を使用できます。NULL

malloc のエラーを確認することを忘れないでください。これは実行時の割り当てであり、必要がなくなったら解放する必要があります。

于 2013-05-23T22:24:31.157 に答える
4

malloc()実行時にメモリを割り当てるためにのみ使用されます。静的変数は、コンパイル時に初期化されます。あなたがしたい:

static int p[1];
于 2013-05-23T22:24:44.017 に答える
1

ファイルが静的である場合は、その静的を初期化するパブリック関数をそのファイルに提供する必要があります。

void initialize () {
    if (p == 0) p = malloc(sizeof(*p));
}

または、静的変数の代わりに静的関数を使用できます。ただし、アクセスごとに小切手がかかります。

static int * p () {
    static int * p_;
    return p_ ? p_ : (p_ = malloc(sizeof(*p_)));
}

整数型の場合、これは少しばかげているように見えpますが、 の戻り値だけでなく、より複雑な初期化シーケンスを必要とするより複雑な型である場合、malloc()このようなものを持つことは理にかなっているかもしれません。

于 2013-05-23T22:27:44.940 に答える
-2

C.それはできません。C++ は静的コンストラクターを使用できます。

main() で最初に割り当てを行うか、ポインターが必要になる前に呼び出される他の関数で行うことができます。

移植性はありませんが、Classic Mac OS の Code Fragment Manager などの一部の実行形式は、初期化/終了エントリ ポイントをサポートしています。CFM の初期化は、C++ の静的構築に使用されました。プラットフォームの実行可能形式が初期化エントリ ポイントをサポートしている場合は、それを使用できます。

于 2013-05-23T22:26:41.617 に答える