假设我有一个像这样的结构:
struct Person { int age; char *name; Person *next_ptr; }
现在我有一个生成2个人的函数并返回指向第一个结构的指针:
Person *GetPerson(){ char[5] p1name = "John"; char[4] p2name = "Bob"; struct Person *p1; struct Person *p2; p2 = malloc(sizeof(struct Person)); strcpy(p2.name, p2name); p2->age = 25; p1 = malloc(sizeof(struct Person)); strcpy(p1.name, p1name); p1->age = 20; p1->next_ptr = p2; return p1; }
并使用该函数来提取Person.
struct Person *person = malloc(sizeof(struct Person)); person = GetPerson(); int person1age = person.age; // Get age char person1name[4] = person.name; // Get name int *person2_ptr = person.next_ptr; // Extract the person 2 pointer struct Person *person2 = malloc(sizeof(struct Person)); person2 = (*person2_ptr); char person2name[4] = person2.name; // gets person 2 name int person2age = person2; // get person 2 age
我希望我明确表示我要做的事情.有人能告诉我实现这个的正确方法吗?
不幸的是,您的代码中存在很多错误.
1.在C语言中,与C++不同,每次你想要制作一个实例时struct Person
,你都要说struct Person
,不是Person
2.在C中,声明char
大小为5 的数组的方法char p1name[5];
不是char[5] p1name;
在体内,GetPerson()
p1
并被p2
声明为指针,这意味着strcpy(p1.name,p1name);
实际应该strcpy(p1->name,p1name);
或甚至strcpy((*p1).name,p1name);
你喜欢.
更严重的问题:
您必须注意,当您为一个实例动态分配内存时struct Person
,您不会自动为该实例分配内存char * name;
; 因为这个召唤strcpy(p1->name,p1name);
会失败.您可以char*
动态保留并为其分配内存,但为了简单起见,我建议您只选择一个char
相当大的数组.
请记住,GetPerson()
为实例分配内存struct Person
并返回指针.现在在你的主要功能中你有:
struct Person *person = malloc(sizeof(struct Person)); //allocating memory in main person = GetPerson(); // you just leaked the memory you allocated in main
你正在分配内存两次.这不会导致程序崩溃,但会导致"内存泄漏",需要避免.您总是希望free()
动态分配内存.
把它放在一起,你得到这个:
#include#include #include struct Person { int age; char name[256]; struct Person *next_ptr; }; struct Person * GetPerson(){ char p1name[5] = "John"; char p2name[4] = "Bob"; struct Person *p1; struct Person *p2; p2 = malloc(sizeof(struct Person)); strcpy(p2->name, p2name); p2->age = 25; p2->next_ptr=NULL; p1 = malloc(sizeof(struct Person)); strcpy(p1->name, p1name); p1->age = 20; p1->next_ptr = p2; return p1; } int main() { struct Person * tmp=GetPerson(); printf(tmp->name); //prints John printf("\n"); printf(tmp->next_ptr->name); //prints Bob printf("\n"); free(tmp); return 0; }
请注意,这在逻辑上仍然不是很好的代码,但它没有错误.