-1

編集: [] は使用しないでください。

値 5 と *malloc で整数 N を定義しました。

#define N

void* malloc (size_t size);

...

int *p_mat=(int*)malloc(sizeof(int*) * N);

これがマトリックスです。

次に、配列が必要です。

int p_arr1=(int)malloc(sizeof(int) * 4);

int p_arr2=(int)malloc(sizeof(int) * 3);

int p_arr3=(int)malloc(sizeof(int) * 1);

int p_arr4=(int)malloc(sizeof(int) * 2);

int p_arr5=(int)malloc(sizeof(int) * 5);

したがって、サイズの異なる 5 つの配列があります。行列の各ポインタが配列の最初のセルを指すようにするにはどうすればよいでしょうか。

もう 1 つの質問ですが、これらの変数を関数に送信するにはどうすればよいですか?つまり、関数キーのパラメーターは何ですか?

4

3 に答える 3

3

異なるサイズの整数配列への 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]psizes[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()

于 2013-05-14T12:55:48.597 に答える
2

編集:まず、いくつかの修正から始めましょう:

int **p_mat=(int**)malloc(sizeof(int*) * N);
int *p_arr1=(int*)malloc(sizeof(int) * 4);
int *p_arr2=(int*)malloc(sizeof(int) * 3);
int *p_arr3=(int*)malloc(sizeof(int) * 1);
int *p_arr4=(int*)malloc(sizeof(int) * 2);
int *p_arr5=(int*)malloc(sizeof(int) * 5);

これで、次のように、行列の各要素が配列の最初の要素を指すようにすることができます。

p_mat[0] = p_arr1;
p_mat[1] = p_arr2;
p_mat[2] = p_arr3;
p_mat[3] = p_arr4;
p_mat[4] = p_arr5;

これを関数に渡したい場合は、

int SomeFunction(int **theMatrix)
{
    /* Get third element of second row */
    int nSecondElementFirstRow = theMatrix[1][2]; /* same as p_arr2[2] above */
}

そして電話する

SomeFunction(p_mat);

あなたのコメントに固有の、関数を持つことができます:

void print_number(int n)
{
    printf("%d\n", n);
}

次のように呼び出します。

 print_number(p_mat[1][2]);

2 行目の 3 番目の要素を出力します。p_arr2[2] が表示されます。p_arr2[2] = 12345;テストする p_arr2 を malloc した直後に設定できます。

最後に、私が読んだばかりの多くのコメントは、私が行ったように malloc の結果をキャストしないことを示唆しています: 私 は malloc の結果をキャストしますか?

于 2013-05-14T12:55:34.823 に答える
1

各配列を最初の配列に関連付ける場合:

p_mat[0] = p_arr1;
p_mat[1] = p_arr2;
//(...)
p_mat[4] = p_arr5;
于 2013-05-14T12:52:40.317 に答える