编写C struct的init函数

时间:2013-11-20 17:17:43

标签: c struct

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

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
}

有谁能告诉我如何解决我的实施问题?

2 个答案:

答案 0 :(得分:7)

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的字符串成员都是string literals,则无需分配存储空间。在这种情况下,您可以简化事情

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

答案 1 :(得分:0)

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

使用:

Variable var1;

然后调用方法:

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