37

ここで学んだことに基づいて: C の関数を介して動的配列を操作します。

void test(int data[])
{
    data[0] = 1;    
}    

int main(void)
{    
    int *data = malloc(4 * sizeof *data);

    test(data);

    return 0;
}

これはうまくいきます。ただし、関数で使用することも試みてreallocいます。

void increase(int data[])
{
    data = realloc(data, 5 * sizeof *data);    
}

これは準拠していますが、実行するとプログラムがクラッシュします。

質問

関数で realloc を使用するにはどうすればよいですか?

reallocの結果を変数に代入し、それがNULL最初かどうかを確認する必要があることを理解しています。これは単なる単純化された例です。

4

3 に答える 3

37

(配列)の値を変更したいint*ので、それへのポインタをincrease関数に渡す必要があります:

void increase(int** data)
{
    *data = realloc(*data, 5 * sizeof int);
}

呼び出しコードは次のようになります。

int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);
于 2012-12-06T16:43:29.013 に答える
7

ポインタと配列の違いに注意してください。
配列はスタック内のメモリのチャックであり、それだけです。配列がある場合:

int arr[100];

この場合、arrはメモリのアドレスですが、&arrはメモリのアドレスであり、そのメモリのアドレスは一定であり、どの場所にも格納されません。したがって、arrは何かを指す変数ではないため、arr=NULLとは言えません。これは単なるシンボリックアドレスであり、配列が開始するアドレスです。代わりに、ポインタには独自のメモリがあり、メモリアドレスを指すことができます。

int[]をint*に変更するだけで十分です。
また、変数はコピーによって渡されるため、関数にint**を渡す必要があります。

reallocの使用方法については、すべての教訓的な例に次のものが含まれます。

  1. reallocを使用します。
  2. NULLかどうかを確認します。この場合、perrorを使用して、プログラムを終了します。
  3. NULLでない場合は、割り当てられたメモリを使用します。
  4. 不要になったメモリを解放します。

だからそれは良い例になるでしょう:

int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
              // casting is optional but I'd suggest it for readability
assert(chuck);
for(unsigned int i=0; i<10; i++)
{
    chunk[i]=i*10;
    printf("%d",chunk[i]);
}
free(chunk);
于 2012-12-06T16:54:50.703 に答える