当前位置:  开发笔记 > 编程语言 > 正文

C返回struct指针

如何解决《C返回struct指针》经验,为你挑选了1个好方法。

假设我有一个像这样的结构:

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> ForeverStude..:

不幸的是,您的代码中存在很多错误.

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

请注意,这在逻辑上仍然不是很好的代码,但它没有错误.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有