7

私は割り当てに取り組んでいました(別の質問の詳細)。その一環として、配列のサイズを増やしていました。そして、配列を初期化しようとすると、次のことがわかりました。

int arr[2097152]; // 8MB

セグメンテーション違反が発生しました...大きすぎる配列を宣言しようとしているためだと思いますか? 次に、これを回避する方法が を使用することであることがわかりましたmalloc。しかし、C は初めてです (主に JavaScript/Python/Java を使用します...)。ポインターなどで非常に混乱します...

配列を 8MB と宣言しました。

int *arr = malloc (MBs * 1024 * 1024 / sizeof(int)); // MBs = 8

しかし今...どうやってアクセスしたり、書き込んだりするのですか? arrアドレスを取得するように使用すると、使用する*arrと最初の要素を取得しますか?

4

5 に答える 5

10

arr[index]のように、配列として宣言されているかのように使用します。C では、表記法x[y]は とまったく同じ*(x + y)です。これは、配列名がその最初の要素へのポインターに変換されるため、配列の場合に機能します。

int *arr = malloc (MBs * 1024 * 1024 / sizeof(int));

要素の数が手元にないため、これは適切なアプローチではありません (必要なサイズにはなりません)。要素の数に基づいて宣言する必要があります。

#define ARR_LENGTH 2097152
int *arr = malloc (ARR_LENGTH * sizeof *arr);

malloc の引数はバイト数なので、要素のサイズを掛ける必要があります。

于 2012-09-26T09:37:43.937 に答える
5

大きすぎる配列を宣言しようとしているからだと思いますか?

はい、確かに。ほとんどの場合、関数でこれを行っています。アレイはスタック上のローカル ストレージに作成され、通常、スタックはこの大きなサイズの要求に対応するのに十分な大きさではありません。
通常の解決策は、動的メモリを使用することです。

どのようにアクセスしたり、書き込んだりできますか? arrアドレスを取得しているように使用すると、使用する*arrと最初の要素が取得されますか?

演算子を使用して、配列を使用するのと同様の方法でアクセスできます[]

ご了承ください、

arr[i] == i[arr] == *(arr + i) == *(i + arr)

そう、

arr[0] ---> Gives you first element
arr[1] ---> Gives you Second element
and so on...

配列の名前は最初の要素へのポインターとして減衰することがありますが、配列とポインターは同じではないことに注意してください。

よく読んだ:

C++ で配列を使用するにはどうすればよいですか?

于 2012-09-26T09:38:01.417 に答える
3

はい、ARRAYと同じように使用できます。

int *arr = malloc (MBs * 1024 * 1024) ;
arr[0] = 1 ;
arr[6] = 675 ;
etc. ;

* arr = arr [0]; \最初の要素

于 2012-09-26T09:44:02.823 に答える
2

表記a[i]はと同じです*(a + i)(したがってi[a]、加算は可換であるため、と同じです)。ポインター演算と配列からポインターへの減衰のおかげで、配列とポインターから配列要素の両方にこの構文を使用できます。

int a[10];
int * b = a + 4;
int * c = malloc(sizeof(int) * 100);

a[2];   // third element of a
b[1];   // sixth element of a
c[3];   // fourth element of the array starting at c

free(c);  // don't forget to clean up!

最初の問題について:自動変数に使用できるスペースは確かに限られています。このスペースのオーバーランは...スタックオーバーフローと呼ばれます。

于 2012-09-26T09:41:34.473 に答える
2

また、大きな配列を静的変数としてスタック領域の外に置くこともできます。おそらく、セグメンテーション違反はもうありません。

于 2012-09-26T11:04:07.153 に答える