代码之家  ›  专栏  ›  技术社区  ›  Arkaik zx81

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

  •  0
  • Arkaik zx81  · 技术社区  · 7 年前

    我试图从一个函数中填充一个结构字段,该函数的结构由指针给定。

    使用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。
    此外,我不想返回指针,因为我正在使用返回代码检查函数中的错误。

    1 回复  |  直到 7 年前
        1
  •  3
  •   user2736738    7 年前

    因为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;
    }