異なるサイズの整数配列への N 個のポインターの配列.... ( C では malloc の戻り値をキャストしないでください- エラーを隠すことができます - Do I cast the result of malloc? を参照してください)。
int i = 0;
int *p[N];
size_t sizes[] = { 4, 3, ..., 5 }; // N sizes
for(; i < N; ++i)
{
p[i] = malloc(sizeof(int) * sizes[i]);
}
現在p
は int へのポインターの配列です。p[n]
したがって、配列内の int への n 番目のポインターです。
int *p[n]
メモリ内では次のようになります。
int *p[n]
+-----+
| | <------- Each element of the array is a pointer-to-an-integer
| |
+-----+
| |
| |
+-----+
.
.
.
+-----+
| |
| |
+-----+
次に を実行すると、ポインタ(配列の各要素がポインタであることを思い出してください) が整数のサイズのメモリ ブロックを指してp[n] = malloc(sizeof(int) * sizes[i])
いると言っています。だからあなたは次のようなものを得る...p[n]
p
sizes[i]
+-----+ +------+------+ ... +------+
|p[n] |-------- array element is a pointer to ---> | int1 | int2 | | intm |
| | | | | | |
+-----+ +------+------+ ... +------+
.
.
.
+-----+
| |
| |
+-----+
したがって、書き込むときは、編集p[n]
したintの配列へのポインターにアクセスしています...malloc()
コードの後半で、割り当てられたメモリを覚えておく必要がありますfree()
:)
for(; i < N; ++i)
{
free(p[i]);
}
お役に立てれば...
編集:あなたの質問の最後の部分を読んでいませんでしたが、ウィルソンマイケルパトリックが答えました...
編集:ところで、私はmalloc()
リターンをチェックしNULL
て、考えられるエラーを処理していないことに注意してください.これは単なる例です...
スタック上で宣言したくなくint *p[N];
、ヒープを好む場合は、次のことを試してください...
int i = 0;
size_t sizes[] = { 4, 3, ..., 5 }; // N sizes
int **p = malloc(sizeof(int *) * N);
for(; i < N; ++i)
{
p[i] = malloc( sizeof(int) * sizes[i]);
}
...
...
for(; i < N; ++i)
{
free(p[i]);
}
free(p);
編集:#include <stdlib.h>
と の定義にfree()
使用malloc()