簡體   English   中英

如何返回不同的結構地址?

[英]How can I return different address of structs?

我在主 function 中有一個結構數組,我想保存幾個結構的數據。 我正在使用 function 接收想要的數據並將其放入定義到 function 中的結構中。 在過程結束時,我返回這個結構的地址。 但是如果我幾次調用這個 function ,它總是定義相同的結構地址,所以我丟失了上一次調用的數據。

#include<stdio.h>

struct data {
    int day;
};

struct data* Dates(int val);

int main() {
    struct data* Dates1[3];
    int array[] = { 12, 15, 2021 };

    for (int i = 0; i < 3; i++) {
        Dates1[i] = Dates(array[i]);   
    }
}

struct data* Dates(int val)  {
    struct data Date;
    Date.day = val;
    return &Date; ///AFTER EVERY CALL TO THIS FUNCTION IT RETURN THE SAME ADDRESS!!!
}

當您調用 function 時,它會創建一個堆棧幀。 該 function 的局部變量在該堆棧幀內分配。 當 function 退出時,堆棧幀被“銷毀”。 那memory可以重復使用。

您會看到這種行為,因為每次在循環中調用 function 時,它都會重用相同的 memory 空間。

您不能依賴當前 function 調用之外的堆棧上分配的變量的地址的有效性。 如果在 function 調用之后需要一個值,則需要動態分配它 - 通常使用malloc 完成后不要忘記free memory。

你必須像這樣寫你 function :

struct data* Date = (struct data*) malloc(sizeof(struct data))
Date->day = val;
return Date;

之后,當不再使用指針時,您必須在指針上調用 free()。 (如果不是這稱為 memory 泄漏)

當您感到困惑時,請記住一個簡單的規則,即您只能將指針返回到創建變量指向的調用級別。 如果您想了解為什么會這樣,您應該閱讀調用堆棧是什么以及堆棧變量如何工作。

如果您不想使用malloc ,另一種方法是讓 function 接收指向未初始化值的指針void Dates(struct data *, int); ,則調用者負責memory。

#include <stdio.h>
#include <assert.h>

struct data {
    int day;
};

static void Dates(struct data *const data, const int val) {
    assert(data); /* Defensive debug. */
    data->day = val;
}

int main(void) {
    int array[] = { 12, 15, 2021 };
    struct data dates1[sizeof array / sizeof *array];

    for(int i = 0; i < sizeof dates1 / sizeof *dates1; i++)
    {
        Dates(dates1 + i, array[i]);
        printf("%d: %d\n", i, dates1[i].day);
    }
}

當人們想要一個與內存分配無關的 function 時,這可能更適合; 在這個例子中,我在堆上而不是動態地保留了 memory。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM