簡體   English   中英

結構的初始化函數(即“構造函數”),為什么變量未正確初始化?

[英]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));
}

筆記:

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.

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