struct的初始化函数(即"构造函数"),为什么变量没有正确初始化?

时间:2015-10-18 20:47:00

标签: c struct initialization

我有一个名为`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));
}

2 个答案:

答案 0 :(得分:2)

当您将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));
}

注意:

答案 1 :(得分:2)

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 */
    ...
}