C malloc结构实现

时间:2016-10-25 20:00:49

标签: c pointers struct malloc

我遇到以下程序的问题。当我尝试编译它时,它会崩溃。我猜它在插入函数的某个地方是一个分段错误,但我无法弄清楚在哪里。

char *names[HOW_MANY]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim",
          "Harriet"};
int ages[HOW_MANY]= {22, 24, 106, 6, 18, 32, 24};

struct person 
{
  char name[40];
  unsigned int age;
  struct person *next;
};

struct person* insert(struct person *people[], char *name, int age) 
{
  struct person *ptr;
  ptr=(struct person * )malloc(sizeof(struct person));
  if(ptr==NULL)
  {
    printf("error");
    return;
  }
  //ptr=ptr->next;
  strcpy(ptr->name,name);
  ptr->age = age;
  ptr->next=NULL;

}

int main() 
{
  struct person *people[HOW_MANY];
  for (int i =0; i<HOW_MANY;i++) 
      insert (people, names[i], ages[i]);

  for(int i=0;i<HOW_MANY;i++)
    printf("%s %d\n", people[i]->name, people[i]->age);
  return 0;
}

1 个答案:

答案 0 :(得分:2)

这是一个小小的变化,可以让你前进:

void insert(struct person **person_ptr, char *name, int age) 
{                      /* ^^^^^^^^^^^^ one person */
  struct person *ptr;
  ...
  ptr->next=NULL;
  *person_ptr = ptr;   /* send _ptr_ back to the calling code. */
}

int main() 
{
  struct person *people[HOW_MANY];
  for (int i =0; i<HOW_MANY;i++) 
      insert (&people[i], names[i], ages[i]);
           /* ^      ^^^ Just pass the one person you're interested in */
  ...
}

说明:**person_ptr获取指针的地址(&people[i])。然后*person_ptr=...将更改该值。因此效果是insert()(实质上)*&people[i]=ptr;,即people[i]=ptr;。您需要&*,因为C通过值而不是引用传递参数。

请注意,代码还存在其他一些问题。

  • 如果内存不足,insert()的来电者不知道。你知道它是因为"error"打印输出,但调用者应该知道它。
  • 正如@eddiem指出的那样,如果您只使用数组,则不需要next
  • 声明
  • insert()返回struct person*,但永远不会分配或使用该返回值。 insert()可以是void insert()或(表示成功或失败)bool insert()