0

これが初心者の質問である場合は、申し訳ありません。私のプログラミングのほとんどは非常に高水準の言語で行われており、C の専門知識は限られています (これは、Matlab、Octave、 Sage、Maximaなどですが、これにはCの速度が必要です)。

とにかく...実行時にmallocでサイズが設定される配列があります。

int *A = malloc(m * sizeof(int));

ここで、m はユーザーが指定した値から計算されます。配列を更新する関数「update」があります(または、必要に応じて、配列を入力として受け取り、別の配列を出力として返します)。この更新関数は、10^8 回以上呼び出すことができます。

そのため、関数自体は malloc を使用して適切なサイズの出力配列を導入できません。そうしないと、メモリが使い果たされます。したがって、たとえば、私はこれを行うことはできません:

int * update(int *L) /* produces next iteration of L */
{
  int *out = malloc(m * sizeof(int));
  /* do some stuff with L and produce new array out */
  return (out);
}

更新関数の外で静的変数を作成しようとしました:

static int *out;

メインでそのサイズを定義します。

out = malloc(m * sizeof(int));

しかし、これもうまくいかないようです。

とにかく、私はいくつかのアドバイスに非常に感謝しています - 私はグーグルの卓越性を使い果たしたと思います.

4

3 に答える 3

3

の外側に配列を割り当ててから、その配列へのupdateポインタを渡します。

void update(int const *L, int *out)
{
    // whatever
}

として呼び出す

int *A = malloc(m * sizeof(int));
if (A == NULL)
    // handle error

for (i=0; i < N_ITER; i++)
     update(L, A);

L インプレースで更新されるようにプログラムを再設計することもできますが。

于 2012-08-01T12:50:11.543 に答える
0

したがって、関数に直接入ってくるデータを処理したいだけであれば、既に部分的に正しいものを持っています。私がする唯一のことは、配列のサイズを入力パラメーターとしてルーチンに追加して、次のようにすることです。

void update(int * L, unsigned int size){
    unsigned int count;

    // Make sure the array has actually been allocated from outside
    if(L == NULL) return;

    // Example work on L just as if it is an array of values
    for(count = 0; count < size; count++){
        L[count] = L[count] + 1;
    }
}

L内の元のデータを維持したくない場合は、これが機能することを忘れないでください。元のデータを維持したい場合は、ラーズマンの回答が適切に機能します。

また、L に入力したい変数は何でも、更新ルーチンの外側とその前に malloc し、別の時点で解放する必要があることも覚えておいてください。

int * myVar = (int *)malloc(m * sizeof(int));

update(myVar, m);

// Other work to be done

free(myVar);
于 2012-08-01T12:56:30.820 に答える
-1

を使用する必要がありますrealloc

int *a = realloc(a, m * sizeof(a[0]));

最初の実行と同じようmallocに機能しますが、その後、異なるサイズの配列が再割り当てされます。新しい配列には、以前の値が割り当てられている場合とない場合があることに注意してください。で与えられるすべてのものと同様に、ガベージがあると想定する必要がありmallocます。

ここに の使用に関する適切な説明がありreallocます。

http://www.java-samples.com/showtutorial.php?tutorialid=589

注: sizeof(a[0]) は sizeof int と同じですが、int を変更しても問題ありません

于 2012-08-01T13:06:55.117 に答える