[英]Initialization function (i.e. “constructor”) for struct, why are variables not being initialized properly?
我有一個名為“ FooStruct”的未命名結構,我為此編寫了一個函數,該函數初始化其所有變量,並負責動態內存分配。
我嘗試運行此代碼,但未產生預期的結果。 由於某些原因,變量在函數內部時已正確初始化,但是一旦退出該塊,它們便會再次更改。
我正在處理的項目要求僅使用未命名的結構。 為什么會這樣呢?
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int fooPrimitive;
} FooStruct;
void FooStructInit(FooStruct * ptr, int num) {
ptr = (FooStruct*)malloc(sizeof(FooStruct));
ptr -> fooPrimitive = num;
// Expected output: 5
// Actual output: 5
printf("ptr -> fooPrimitive: %d\n", (ptr -> fooPrimitive));
}
int main() {
FooStruct * ptr;
FooStructInit(ptr, 5);
// Expected output: 5
// Actual output: some random number
printf("FooStruct -> fooPrimitive: %d\n", (ptr -> fooPrimitive));
}
當將ptr
傳遞給FooStructInit
,它將被復制,然后為該副本分配malloc
的返回值。 這稱為傳遞值 。 而是傳遞指向ptr
的指針以實際寫入ptr
,而不僅僅是傳遞的參數:
void FooStructInit(FooStruct** ptr, int num) {
*ptr = malloc(sizeof(FooStruct));
(*ptr)->fooPrimitive = num;
// Expected output: 5
// Actual output: 5
printf("(*ptr)->fooPrimitive: %d\n", ((*ptr)->fooPrimitive));
}
int main() {
FooStruct* ptr;
FooStructInit(&ptr, 5);
// Expected output: 5
// Actual output: 5
printf("FooStruct->fooPrimitive: %d\n", (ptr->fooPrimitive));
}
筆記:
malloc
之后調用free
malloc
的結果 C僅具有按值傳遞語義,因此,當您將指針傳遞給函數時,指針的原始值不會更改,而只會在函數中更改本地副本。
解決此問題的方法是將一個指針傳遞給一個指針,以便您可以更改原始存儲位置的值。
void FooStructInit(FooStruct **ptr, int num) {
*ptr = malloc(sizeof(FooStruct));
...
}
int main(void) {
FooStruct * ptr;
FooStructInit(&ptr, 5); /* get the address of the pointer */
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.