我一直在尝试使用以下代码返回一个指向函数结构的指针,该函数接受一个结构并返回指向它的指针:
#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;
}
但是当我尝试使用返回的指针访问结构的值时,它无法正常工作。它只显示&#39; id&#39;但不是&#39;名称&#39;。 这可能是什么问题? 我已经在一本书中读过,该书曾说过在函数体中使用它:
ptr = (struct mystruct *)malloc(sizeof(struct mystruct));
ptr-> id = a.id;
strcpy(p->name,a.name);
//struct 'a' is argument to function
return ptr;
如果这是正确的解决方案那么为什么呢?
答案 0 :(得分:7)
因为您要返回的def exit():
print("Shutting down.")
if __name__ == '__main__':
choices = { "1" : createPerson , "2" : searchPerson, "3": exit }
x = '1'
while x != "3":
print(' (1) Create new person')
print(' (2) Search for a person')
print(' (3) Quit')
x = input('Select an option -> ')
if x not in ['1', '2', '3']:
print('Please choose one of the available options.')
continue
choices[x]()
是您传递的副本。 c中的参数按值传递,因此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()
时,数据将在任何可访问的 1 处有效,直到您使用struct
手动销毁它为止, free()
函数将简单地释放内存,它不关心以后会用它做什么,它只是将它返回到它的来源。
此外,始终检查free()
的返回值。
1 只要有指针保存malloc()
原始返回的内存地址。当您确定不再需要malloc()
时,这正是您必须传递给free()
的地址。
答案 1 :(得分:4)
你应该这样做:
p = &tag;
指向相同的结构tag
。不要这样做:
p = return_pointer(tag);
因为当您传递tag
时,您会按值传递它并创建一个副本(在函数a
中称为return_pointer
),因此,tag
和a
(具体地说,那些(&tag
和&a
)的地址不同 - 参见Caleb先生的评论)在函数中是不一样的。
答案 2 :(得分:2)
函数参数是函数的局部变量。它们在函数完成工作后被销毁。
您要做的是通过引用传递结构并返回对它的引用。在这种情况下,函数看起来像
//this is the function
struct mystruct * return_pointer( struct mystruct *ptr )
{
return ptr;
}
并调用
p = return_pointer( &tag );
虽然这种功能没有用处。然而,一般来说,它可以例如更改传递对象的一些数据成员。
答案 3 :(得分:0)
我是来自中国的代码初学者,你的代码的错误是局部变量的域(ptr是一个指针)只在函数中有效,但当你将它返回到你的全局主函数时,它指向已被释放的记忆。所以它变成了一个错误。我很高兴回答你的问题!