繁体   English   中英

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

[英]Returning a pointer to structure from a function

我一直在尝试使用以下代码返回一个指向函数结构的指针,该函数接受一个结构并返回一个指向它的指针:

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

但是当我尝试使用返回的指针访问结构的值时,它无法正常工作。 它只显示'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;

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

因为你是返回a不是您传递的一个副本。 中的参数按值传递,因此a是在不同位置分配的tag的副本,该位置是函数的堆栈帧,并在函数返回时被销毁。

因此,在打印时,您正在打印解除分配的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()的返回值。


1 只要有指针保存malloc()最初返回的内存地址。 当你决定不再需要struct时,这正是你必须传递给free()的地址。

你应该这样做:

p = &tag;

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

p = return_pointer(tag);

因为当你传递tag ,你按值传递它并创建一个副本(在函数return_pointer称为a ),因此,你的taga (具体地说,那些地址(即&tag&a )是不同的 -见Caleb先生的评论)在功能上是不一样的。

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

您要做的是通过引用传递结构并返回对它的引用。 在这种情况下,该功能将如下所示

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

并称之为

p = return_pointer( &tag );

虽然这种功能没有用处。 然而,通常它可以例如改变传递的对象的一些数据成员。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM