编写C struct的init函数

所以这是我在头文件中的结构:

struct _Variable { char *variableName; char *arrayOfElements; int32_t address; }; typedef struct _Variable Variable; 

这是我在.c文件中的init函数的实现:

 void initVariable(Variable *variable, char *variableName, char *arrayOfElements, int32_t address) { int lengthOfVariableNameWithTerminatingChar = strlen(variableName) + 1; variable->variableName = malloc( sizeof(char) * lengthOfVariableNameWithTerminatingChar); strncpy(variable->variableName, variableName, lengthOfVariableNameWithTerminatingChar); int lengthOfArrayOfElementsWithTerminatingChar = strlen(arrayOfElements) + 1; variable->arrayOfElements = malloc( sizeof(char) * lengthOfArrayOfElementsWithTerminatingChar); strncpy(variable->arrayOfElements, arrayOfElements, lengthOfArrayOfElementsWithTerminatingChar); variable->address = address; } 

我编译时没有错误,但是当我运行我的测试文件时:

 void test_initVariable() { printf("\n---------------test_initVariable()-----------------\n"); // TODO: Variable *variable1; initVariable(variable1, "variable1", "1, 2, 3", 4); // <== Causes binary .exe file to not work } 

谁能告诉我如何修复我的实现?

 Variable *variable1; 

给你一个未初始化的指针。 你没有它所指向的内存,因此无法安全地写入它。

您需要为variable1分配存储空间

 Variable variable1; initVariable(&variable1, "variable1", "1, 2, 3", 4); 

会工作。

如果你想动态分配variable1 ,那么让initVariable处理它是最容易的

 Variable* initVariable(char *variableName, char *arrayOfElements, int32_t address) { Variable* var = malloc(sizeof(*var)); if (var != NULL) { var->variableName = strdup(variableName); var->arrayOfElements = strdup(arrayOfElements); var->address = address; } return var; } 

请注意,我在这里也简化了字符串的分配/填充。 您的代码可以工作,但如果您使用的是posix兼容系统, strdup是一种更简单的方法来实现相同的结果。

正如注释中所讨论的,如果Variable的字符串成员都是字符串文字 ,则不需要分配存储。 在这种情况下,您可以简化操作

 Variable* initVariable(char *variableName, char *arrayOfElements, int32_t address) { Variable* var = malloc(sizeof(*var)); if (var != NULL) { var->variableName = variableName; var->arrayOfElements = arrayOfElements; var->address = address; } return var; } 

您应该将&variable1传递给您的方法。 运算符&将获取结构的地址,这是您需要分配给variable上的指针。

使用:

 Variable var1; 

然后调用方法:

 initVariable(&var1, "variable1", "1, 2, 3", 4);