11

違いは何ですか

struct mystruct *ptr = (struct test *)malloc(n*sizeof(struct test));

struct mystruct **ptr = (struct test *)malloc(n*sizeof(struct test *));

どちらも正常に動作します。2 つの実際の違いに興味があります。最初のものは構造体の配列を割り当てますが、2番目のものは構造体ポインターの配列ですか? 逆に?また、メモリフットプリントが小さいのはどれですか?

4

3 に答える 3

20

1 つは の配列を割り当て、もう 1structつは へのポインタの配列を割り当てますstructptr[0].field1 = value;最初のケースでは、すぐに割り当てることでフィールドに書き込むことができますが、2 番目のケースではstruct、実際の書き込みを行う前にフィールド自体を割り当てる必要があります。

結果のキャストをmallocC にドロップしても問題ないため、次のように記述できます。

struct mystruct **ptr = malloc(n*sizeof(struct test *));
for (int i = 0; i != n ; i++) {
    ptr[i] = malloc(sizeof(struct test));
}
ptr[0]->field1 = value;
...
// Do not forget to free the memory when you are done:
for (int i = 0; i != n ; i++) {
    free(ptr[i]);
}
free(ptr);
于 2012-09-08T20:50:23.310 に答える
2

2つの実際の違いに興味があります

この関数mallocは、構造体やポインターを扱いません。バイトのみを理解します。したがって、1 つ目は n 個のオブジェクトに十分なバイトをstruct test割り当て、2 つ目は n 個のオブジェクトに十分なスペースを割り当てstruct test *ます。

両方とも正常に動作します

一見すると、この 2 つはまったく異なる用途に使用されます。たとえば、2 番目のケースでは、ptr[i]要素ごとにメモリを割り当てる必要があります。

また、メモリフットプリントが小さいのはどれですか

印刷sizeof(struct test)してsizeof(struct test *). しかし、繰り返しになりますが、それらは別のものであり、別の目的を持っています。トラクターとカブトムシでは、足跡が小さいのはどちらですか?

于 2012-09-08T20:50:37.337 に答える
1

1 つ目は、構造体の配列を割り当てます。2 つ目は、ポインターの配列を構造体に割り当てます (構造体自体のメモリはありません)。もちろん、構造体もポインターのように非常に小さい場合を除き、2番目は小さくなります。

于 2012-09-08T20:50:56.397 に答える