[英]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
不是您传递的一个副本。 c中的参数按值传递,因此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
),因此,你的tag
和a
(具体地说,那些地址(即&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.