gpt4 book ai didi

C malloc 结构体实现

转载 作者:行者123 更新时间:2023-11-30 20:54:26 25 4
gpt4 key购买 nike

我在使用以下程序时遇到问题。当我尝试编译它时,它崩溃了。我猜这是插入函数中某处的段错误,但我就是不知道在哪里。

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

最佳答案

这里有一个小改动,可以帮助您继续前进:

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()

关于C malloc 结构体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40248699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com