1

C で構造体を宣言するときに、次のように言います。

typedef struct my_stuct {
 int x;
 float f;
} STRT;

この構造体のインスタンスを作成して使用する場合は、構造体のメンバーを実際に初期化/使用する前に、明示的に malloc を呼び出し、この構造体のメモリ位置へのポインターを取得する必要があります。

STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));

ただし、プリミティブ データ型 ("int a;" など) を宣言してから初期化する (またはその他の操作を行う) 場合は、実行する前に malloc を呼び出して明示的にメモリ領域を割り当てる必要はありません。その上での操作:

// we do not need to do a malloc(sizeof(i)) blah blah here. Why?
i = 10;

この矛盾の理由を教えてください。ありがとうございました!

4

5 に答える 5

7

矛盾はありません。2つのメソッドはそれぞれ、プリミティブとstructs:の両方で使用できます。

  STRT s1 = {1, 2};
  int i1 = 1;

  STRT *s2 = (STRT *)malloc(sizeof(STRT));
  int *i2 = (int *)malloc(sizeof(int));
  ...
于 2013-01-04T18:49:20.057 に答える
2

malloc の例では、ポインターを使用しています。あなたが言うように、矛盾は、ポインターがいくつかの方法で初期化される可能性があるためです。新しいメモリ割り当てによって常に初期化されるわけではありませんが、既存のメモリ ブロックを指すように初期化することもできます。したがって、変数をヒープに割り当てる必要があると言語が想定することはできません。

STRT* my_struct_instance; // here I assume (incorrectly) that it is automatically allocated on the heap
my_struct_instance->x = 0; // ERROR: uninitialized use of that variable

それがあなたの質問に答えるかどうかわかりません。

于 2013-01-04T18:58:28.427 に答える
2

できるよ:

int i;

また

int *i = (int*) malloc(sizeof(int));

あなたができるように

STRT my_struct_instance;

また

STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));
于 2013-01-04T18:51:25.767 に答える
1

両方の方法で行うことができ、矛盾はありません。

ヒープ

int* a= malloc(sizeof(int));
*a=10;
STRT* b= malloc(sizeof(STRT));
b->x=1; 
b->f=1.0;

スタック

int a=10;
STRT b= {1, 1.0};
于 2013-01-04T18:52:10.063 に答える
0
STRT * my_struct_instance = (STRT *) (malloc(sizeof(STRT)));

動的ストレージを使用します。

int a;

自動ストレージを使用します(現在C ++名を使用していますが、おそらくCでも同様に呼び出されます)。つまり、これらはまったく異なる2つのことです。int a;ローカルで、(ほとんどの実装で)スタック上にあります(ただし、スタックは関連する実装の詳細ではありません)。SRTR * [...](ほとんどの実装では)ヒープ上で動的です(ただし、ヒープは関連する実装の詳細ではありません)。

したがって、矛盾はありません。あると言うのは、リンゴとオレンジの間に矛盾があると言うようなものですが、もちろん、リンゴとオレンジを比較しているので、矛盾があります。(質問の他の部分は、リンゴとオレンジが同じものであるという仮定に基づいているため、意味がありません)。

于 2013-01-04T18:54:11.453 に答える