簡體   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