1

このような配列を宣言するにはどうすればよいですか:

int array[1000000];

静的配列、スタック配列、およびヒープ割り当て配列として?

4

4 に答える 4

2

あなたの課題はこれを探しているようです:

// global variable; NOT on the stack. Exists in the data segment of the program
int globalvar[1000000];

void func()
{
    // local stack-variable. allocated on the stack on function entry
    //  unavailable outside this function scope.
    int stackvar[1000000];

    // allocated on the heap. the only stack space used in the
    //  space occupied by the pointer variable.
    int *heapvar = malloc(1000000 * sizeof(int));
    if (heapvar != NULL)
    {
        // use heap var

        // free heap var
        free(heapvar)
    }
}

またはおそらくこれ:

void func()
{
    // static variable; NOT on the stack. Exists in a program data segment (usually)
    static int staticvar[1000000];
    
    // local stack-variable. allocated on the stack on function entry
    //  unavailable outside this function scope.
    int stackvar[1000000];

    // allocated on the heap. the only stack space used in the
    //  space occupied by the pointer variable.
    int *heapvar = malloc(1000000 * sizeof(int));
    if (heapvar != NULL)
    {
        // use heap var

        // free heap var
        free(heapvar)
    }
}

それだけの価値はありますが、4 または 8 メガバイト (またはそれ以上) の予約済みコール スタックがない限り、上記の関数はエントリ時に鳴る可能性があります。malloc()このような大きなサイズの場合、ヒープ ( / )を使用するのが通例free()です。しかし、それはあなたの任務が(まだ)そうであるように見えるものではありません。

于 2012-11-16T16:18:02.820 に答える
0

関数内の static 宣言は、宣言された変数が宣言されている関数の実行間で共有されることを意味します。スタックは、現在実行中の関数が使用できるメモリ内の場所です。関数が実行されていないときに、スタック上の領域が上書きされないように保護する方法はありません。静的変数は通常、データに格納されるか、プログラムの bss セクションに初期化されている場合に格納されます。配列をスタックに入れるという厳密な要件がある場合は、コピーしてみてください。

void foo(void) {
   static int my_static_array[16];
   int array_copy[16];

   memcpy(array_copy,my_static_array,sizeof array_copy);

   /* do funny stuff */

   memcpy(my_static_array,array_copy,sizeof my_static_array);
}
于 2012-11-16T15:54:24.323 に答える
0

公開したい場合はarray、任意のスコープ外 (コード ブロックの外) で定義でき、バイナリのテキスト セグメントで宣言されます。

于 2012-11-16T16:05:26.687 に答える
0

静的変数をスタックに置くことはできません。これは、静的変数とローカル変数が根本的に異なるためです。ローカル変数はスタックに「存在」し、静的変数は静的セグメントに「存在」します。ローカル変数が宣言されている関数によって呼び出される関数からローカル変数を参照できるようにする場合は、そのローカル変数を引数として渡す必要があります。推奨されない他の解決策は、配列への静的ポインターを持ち、スタックに存在する配列を指すようにすることです。これは、ローカル配列が宣言されている関数が返されない限り機能します。戻った後、ポインターは他のデータが存在する可能性のある領域を指します。つまり、戻りアドレスまたは無関係なローカル変数または関数引数を上書きすることができます。

于 2012-11-16T16:02:30.193 に答える