编译错误:请求不是结构或联合错误

时间:2012-10-21 15:06:42

标签: c

在这个程序中,我试图创建一个结构,然后初始化一个具有该结构类型的数组,将名称和年龄放入数组中,并打印出结果。但是,当我编译文件时,它说“名字”和“年龄”不是结构或联合。有人可以发现我的错误。谢谢你

#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);
  }

}

2 个答案:

答案 0 :(得分:2)

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]);
}

答案 1 :(得分:1)

person *p[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结构和工会成员
  后缀表达式后跟->运算符和标识符   指定结构或联合对象的成员。价值是   第一个表达式的对象的命名成员   点,并且是左值)如果第一个表达式是指针        如果是限定类型,则结果具有指定类型的限定版本           构件。