我遇到以下程序的问题。当我尝试编译它时,它会崩溃。我猜它在插入函数的某个地方是一个分段错误,但我无法弄清楚在哪里。
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;
}
答案 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"
打印输出,但调用者应该知道它。 next
。insert()
返回struct person*
,但永远不会分配或使用该返回值。 insert()
可以是void insert()
或(表示成功或失败)bool insert()
。