【发布时间】:2016-10-25 20:00:48
【问题描述】:
以下程序有问题。当我尝试编译它时,它崩溃了。我猜这是插入函数中某处的分段错误,但我就是不知道在哪里。
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;
}
【问题讨论】:
-
您是否使用调试器单步执行了代码?那应该告诉你哪条线路有故障。我注意到
insert实际上从未将ptr放入people数组中,我猜这是根本问题。 -
您的代码中有相互冲突的目标。拥有
next成员会使您看起来想要一个人的链接列表,但您在main()中声明了一个struct person指针数组。你是想构造一个数组还是一个人的链表? -
结构人指针数组
-
如果你想在
insert()函数中处理一个数组,那么你需要传递你想修改的人的索引,比如i循环计数器变量和将people[i]设置为等于您分配的person对象。 -
您收到了哪些编译器警告?您将函数定义为
struct person* insert(...) ...,但实际上并没有返回值 - 您只是从函数的底部跌落。