从函数返回指向结构的指针

Returning a pointer to structure from a function

我一直在尝试 return 从使用以下代码的函数和接受结构的函数指向结构的指针,return 是指向它的指针:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct mystruct
{
    int id;
    char name[10];
};


//this is the function
struct mystruct *return_pointer(struct mystruct a)
{
    struct mystruct *ptr;
    ptr = &a;
    return ptr;
}

int main()
{
    struct mystruct tag, *p;
    tag.id = 12;
    strcpy(tag.name,"abcd");

    printf("Values are: %d\t%s",tag.id,tag.name);
    p=return_pointer(tag);

    printf("\nValues through pointer: %d\t%s", p->id, p->name);
    return 0;
}

但是当我尝试使用 returned 指针访问结构的值时,它无法正常工作。它只显示 'id' 但不显示 'name'。 这里可能出现的问题是什么? 我在一本书中读到说要在函数体中使用它:

ptr = (struct mystruct *)malloc(sizeof(struct mystruct));
ptr-> id = a.id; 
strcpy(p->name,a.name); 
//struct 'a' is argument to function

return ptr;

如果这是正确的解决方案,那为什么呢?

因为您正在 return 复制 a,这是您通过的副本。 中的参数按值传递,因此 a 是分配在不同位置的 tag 的副本,该位置是函数的堆栈帧,当函数 returns.

因此在打印时您正在打印释放的 struct,这是未定义的行为。如果你希望你的代码出于任何原因工作,试试这个

struct mystruct *
return_pointer(struct mystruct *a)
{
    return a;
}

并在 main() 中将其更改为

p = return_pointer(&tag);
//                 ^ Pass the address of tag and return it
//                   the same as
//                    
//                                   p = &tag;
//
//                   which is why they say it's pointless in
//                   the comments

当您使用 malloc() 时,您在堆上分配了 struct,数据将在任何可访问的地方有效1,直到您用 free()free() 函数将简单地释放内存,它不关心稍后会用它做什么,它只是将它返回到它来自的地方。

此外,始终检查 malloc() 的 return 值。


1只要有一个指针保存由 malloc() 编辑的 return 原始内存地址。当您决定不再需要 struct 时,这正是您必须传递给 free() 的地址。

你应该这样做:

p = &tag;

指向相同的结构tag。不要这样做:

p = return_pointer(tag);

因为当您传递 tag 时,您按值传递它并创建一个副本(在函数 return_pointer 中称为 a)因此,您的 taga(具体来说,函数中那些(即 &tag&a)的地址不同 - 请参阅 Caleb 先生的评论)不相同。

函数参数是函数的局部变量。它们在函数完成其工作后被销毁。

您要做的是通过引用传递一个结构,return 传递对它的引用。在这种情况下,函数看起来像

//this is the function
struct mystruct * return_pointer( struct mystruct *ptr )
{
    return ptr;
}

并称赞

p = return_pointer( &tag );

虽然这样的功能用处不大。然而,一般来说,它可以更改传递对象的某些数据成员。

我是来自中国的code-beginner,你的代码错误是局部变量(ptr是一个指针)的域只在函数中有效,但是当你的return它到你的全局主函数,它指向的内存已经被释放。所以它变成了一个错误。我很高兴回答您的问题!