2

このプログラムでは、構造体を作成し、その構造体型で配列を初期化し、名前と年齢を配列に入れ、結果を出力しようとしています。ただし、ファイルをコンパイルすると、「名前」と「年齢」は構造や共用体ではないと表示されます。誰か私のエラーを見つけてください。ありがとう

#include <stdio.h>
#include <stdlib.h>

/* these arrays are just used to give the parameters to 'insert',
   to create the 'people' array */
char *names[7]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim",
          "Harriet"};
int ages[7]= {22, 24, 106, 6, 18, 32, 24};


/* declare your struct for a person here */
typedef struct{
  char *names;
  int ages; 
}  person;

static void insert (person **p, char *s, int n) {

   *p = malloc(sizeof(person));

  static int nextfreeplace = 0;

  /* put name and age into the next free place in the array parameter here */
    (*p)->names=s;
    (*p)->ages=n;

  /* modify nextfreeplace here */
  nextfreeplace++;
  }

int main(int argc, char **argv) {

  /* declare the people array here */
   person *p[7];

   //insert the members and age into the unusage array. 
  for (int i=0; i < 7; i++) {
    insert (&p[i], names[i], ages[i]);
    p[i]= p[i+1];
  }

  /* print the people array here*/
  for (int i=0; i < 7; i++) {
    printf("name: %s, age:%i\n", p[i].names, p[i].ages);
  }

}
4

2 に答える 2

3

p構造体へのポインタの配列として宣言します。printf 行では、一度逆参照pしますp[i]が、 p はまだ構造体へのポインターです。そのフィールドにアクセスしたい->

for (int i=0; i < 7; i++) {
  printf("name: %s, age:%i\n", p[i]->names, p[i]->ages);
}

for ループをインクリメントiすると、p[i] ポインターを移動したり、削除したり、p[i] = p[i + 1]

for (int i=0; i < 7; i++) {
  insert (&p[i], names[i], ages[i]);
}
于 2012-10-21T15:10:33.713 に答える
1

person *p[7]への 7 つのポインターの配列を宣言するpersonのでp[i]、構造体へのポインターです。したがって、このポインターを逆参照して、そのメンバーにアクセスする必要があります。

printf("name: %s, age:%i\n", (*p[i]).names, (*p[i]).ages);

読みやすくするために、後置演算子を使用できます->

printf("name: %s, age:%i\n", p[i]->names, p[i]->ages);

C11 (1570), § 6.5.2.3 構造体と共用体のメンバー
演算子と識別子 が後に続く後置式->は、構造体または共用体オブジェクトのメンバーを指定します。値は、最初の式が指すオブジェクトの名前付きメンバーの値であり、左辺値です) 最初の式が修飾された型へのポインターである場合、結果は指定されたメンバーの型の修飾されたバージョンを持ちます。 .

于 2012-10-21T15:11:04.653 に答える