0
typedef struct {

   struct {
      double i1, i2;
   } EXP;

   struct {
      double i1, i2;
   } SIN;

   struct {
      double i1, i2;
   } PULSE;

   struct {
      double *i1, *i2;
   } PWL;
} TRANS;

struct term {
   TRANS trans;
   struct term *nxt;
};

int main() {
   struct term *look;
}

上記の構造体とポインターが構造体の用語を参照しています。構造体 PWL 内でポインター i1 を逆参照する方法を教えてもらえますか?

私はこれを試しました:

*(look->trans.PWL.i1)

しかし、それはセグメンテーション違反を引き起こします。

前もって感謝します!

4

2 に答える 2

2

セグメンテーション違反は、ポインタを割り当てたが、ポインタが指すメモリを作成しなかったことが原因です。それを行ったら、*(look->trans.PWL.i1)実際に内部構造体でそのフィールドにアクセスする方法です。

構造体とその中のすべての参照にメモリを割り当てる必要があります。

struct term *look = malloc(sizeof(struct term));
look->trans.PWL.i1 = malloc(sizeof(double));
look->trans.PWL.i2 = malloc(sizeof(double));

そして当然のことながら、完了しfreeたら を呼び出してプロセスを逆にする必要があります。

free(look->trans.PWL.i2);
free(look->trans.PWL.i1);
free(look);

または、おそらくi1i2別の場所に割り当てられた値を指すことを意図している場合は、次のようになります。

struct term *look = malloc(sizeof(struct term));
look->trans.PWL.i1 = &look->trans.EXP.i1;
look->trans.PWL.i2 = &look->trans.EXP.i2;

そして、あなたの割り当てを解除するには free look. への呼び出しが成功するたびに、 へmallocの呼び出しをペアにすることを忘れないでくださいfree

于 2013-01-14T21:18:58.783 に答える
0

特定のPWL.i1

int main() {
   struct term *look;                   // set up your variable
   look = malloc(sizeof(struct term));  // give it some memory
   look->trans.PWL.i1 = malloc(sizeof(double)); //give some memory to your double pointer
   *(look->trans.PWL.i1) = 5.0;         // assign it a value
   printf("%lf\n", *(look->trans.PWL.i1));
   return 0;
}

したがって、lookは構造体へのポインターであるためterm、その要素にアクセスするときは、それを参照する必要があり、その後、演算子->を介して他のメンバーにアクセスするだけで、メンバー ( ) にアクセスする必要があります。.

look->trans.PWL.i1

この場合、PWL のi1メンバーはポインターであるため、値を割り当てるには全体を参照する必要があります。(そうする前に、そこにメモリを割り当てる必要があります)

もちろん、完了したらすべてを解放します。

于 2013-01-14T21:22:36.520 に答える