1

私はこの質問への答えをこのサイトで長く懸命に探しましたが、それでも私の目標を達成できないようです。コードはコンパイルされ、追加しようとしている代入ステートメントがなくても正常に機能します。すべてがこのコードのポインターであるという事実は、私を混乱させていますが、それを変更することはできません。私のコードではありません。x_array基本的には、 (の最初のインデックスのみ)のすべての値をオーバーライドして、にbs格納されている値にしy_arrayます。プログラムの構造は次のとおりです。

typedef struct
{
  double *x_array;
} b_struct;
typedef struct
{
  b_struct *bs;
} a_struct;

void fun_1(a_struct *as);
void allocate_b(b_struct *bs);
void allocate_a(a_struct *as);
int main(void)
{
  a_struct *as
  as = (a_struct *)malloc(sizeof(a_struct));
  allocate_a (as);
  fun_1 (as);
  // everything internal to sa is deallocated in separate functions
  free (as);
  return (0);
}
void allocate_a(a_struct *as)
{
   int i;

   if ((as->bs =(b_struct *)malloc(5*sizeof(b_struct))) == NULL)
   {
     printf("Error: Not enough memory!\n");
     exit(1);
   }
     for(i=0;i<5;i++) allocate_b (&(as->bs[i]));
  return;
}
void allocate_b(b_struct *bs)
{
  if ((bs->x_array =(double *)malloc(10*sizeof(double))) == NULL)
    {
      printf("Error: Not enough memory!\n");
      exit(1);
    }
  return;
}

void fun_1(a_struct *as)
{
  int i;
  double y_array[10]; // the values i need are read into this array
  // the following line is what will not compile
  for (i=0; i<10; i++) as->bs[0]->x_array[i]=y_array[i];
  return;
}  

&私は足し算の多くの順列を試しまし*()たが、得るたびに:

error: expression must have pointer type  

コードは非常に長く複雑で、特定の質問に関連するものを解析しようとしました。完全なプログラムにしようとしましたが、構文がおかしくなったらごめんなさい。うまくいけば、これは代入ステートメントが機能するために何が起こる必要があるかを理解するのに十分です。誰かがこれらのネストされたポインタ構造体とポインタ配列の各層にアクセスする方法を説明できますか?

4

1 に答える 1

2
for (i=0; i<10; i++) as->bs[0]->x_array[i]=y_array[i];

あなたのコードbs[0]ではポインタではなく、それはb_structです。その行を次のように変更します。

for (i=0; i<10; i++)
    as->bs[0].x_array[i]=y_array[i];
            ^^^
于 2012-09-13T18:56:21.000 に答える