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