从函数返回指向结构的指针
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
,这是您通过的副本。 c 中的参数按值传递,因此 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
)因此,您的 tag
和 a
(具体来说,函数中那些(即 &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它到你的全局主函数,它指向的内存已经被释放。所以它变成了一个错误。我很高兴回答您的问题!
我一直在尝试 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
,这是您通过的副本。 c 中的参数按值传递,因此 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
)因此,您的 tag
和 a
(具体来说,函数中那些(即 &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它到你的全局主函数,它指向的内存已经被释放。所以它变成了一个错误。我很高兴回答您的问题!