[英]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.