通过引用函数[duplicate]传递时分配结构和填充字段

问题描述 投票:0回答:1

我正在尝试从指针给出结构的函数填充结构字段。

在使用malloc分配结构后,返回的指针为非null,并且结构字段已初始化,但是在返回main之后。传递给函数的指针为null。

这是一个简化的例子

#include <stdlib.h>
#include <stdio.h>

#define INFO(fmt, args...)      printf(fmt, ## args);
#define ERROR(fmt, args...)     printf("In %s : " fmt, __func__, ## args);

typedef enum 
{
    ERR_OK = 0,
    ERR_KO = -1,
    ERR_MALLOC_FAIL = -2,

}error_t;

typedef struct 
{
    unsigned int field;
}test_struct;

int struct_constructor(test_struct* myStruct, unsigned int field)
{
    myStruct = malloc(sizeof(test_struct));

    if(NULL == myStruct)
    {
        ERROR("Error allocating memory for myStruct\n");
        return ERR_MALLOC_FAIL;
    }

    INFO("passed field = %d\n", field);

    myStruct->field = field;

    INFO("struct field = %d\n", myStruct->field);

    return ERR_OK;
}

int main(void)
{
    test_struct* myStruct = NULL;

    struct_constructor(myStruct, 1);

    if(myStruct == NULL)
    {
        INFO("NULL structure in main\n");
    }
}

这是输出:

passed field = 1
struct field = 1
NULL structure in main

我不明白为什么结构的指针在函数内部不为null,在main中为null。 此外,我不想返回指针,因为我正在使用返回代码来检查我的函数中出了什么问题。

c pointers structure
1个回答
3
投票

好吧因为C是按值传递的,所以你所做的任何更改都是对本地指针变量的。 main()与它无关。如果您返回该指针并将其指定给您想要更改的指针,它将起作用。

或者传递它的地址并对原始变量进行更改。

struct_constructor(&myStruct, 1);

int struct_constructor(test_struct** myStruct, unsigned int field)
{
    *myStruct = malloc(sizeof(test_struct));

    if(NULL == *myStruct)
    {
        ERROR("Error allocating memory for myStruct\n");
        return ERR_MALLOC_FAIL;
    }

    INFO("passed field = %d\n", field);

    myStruct->field = field;

    INFO("struct field = %d\n", (*myStruct)->field);

    return ERR_OK;
}
© www.soinside.com 2019 - 2024. All rights reserved.