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

you declare p as an array of pointer to structure. On printf line, you dereference once p with p[i], but p is still a pointer to a structure, you want to access its fields with ->

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

And as you increment i in your for loop, you dont need to move your p[i] pointer, remove, 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] declare an array of seven pointers to person, so p[i] is a pointer to structure. Therefore, you need to dereference this pointer to access to its members.

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

To improve readability, you can use the postfix operator ->.

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

C11 (1570), § 6.5.2.3 Structure and union members
A postfix expression followed by the -> operator and an identifier designates a member of a structure or union object. The value is that of the named member of the object to which the first expression points, and is an lvalue) If the first expression is a pointer to a qualified type, the result has the so-qualified version of the type of the designated member.

于 2012-10-21T15:11:04.653 回答