通过引用传递给函数时分配结构和填充字段
Allocate structure and fill fields when passed by reference to a function
我正在尝试从一个函数中填充一个结构字段,该结构由指针指定给该函数。
在使用 malloc 分配结构后,returned 指针为非空并且结构字段初始化良好,但是在 returning 到 main 之后。我传递给函数的指针是空的。
这里是一个简化的例子
#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
我不明白为什么结构指针在函数内部不为空而在main中为空。
我也不想 return 指针,因为我正在使用 return 代码来检查我的函数出了什么问题。
因为 C 是按值传递的,所以您所做的任何更改都是针对局部指针变量的。 main()
与它无关。如果您 return 该指针并将其分配给您想要更改的指针,它将起作用。
或者传递它的地址并修改原来的变量。
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;
}
我正在尝试从一个函数中填充一个结构字段,该结构由指针指定给该函数。
在使用 malloc 分配结构后,returned 指针为非空并且结构字段初始化良好,但是在 returning 到 main 之后。我传递给函数的指针是空的。
这里是一个简化的例子
#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
我不明白为什么结构指针在函数内部不为空而在main中为空。
我也不想 return 指针,因为我正在使用 return 代码来检查我的函数出了什么问题。
因为 C 是按值传递的,所以您所做的任何更改都是针对局部指针变量的。 main()
与它无关。如果您 return 该指针并将其分配给您想要更改的指针,它将起作用。
或者传递它的地址并修改原来的变量。
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;
}