c - 为 C 结构编写 init 函数

标签 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
}

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

最佳答案

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

关于c - 为 C 结构编写 init 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20102551/

相关文章:

c - C语言的字数统计程序没有输出

c - 如何在linux中控制dcd

c - 在 x 元素的数组(int)中,数组(静态)的最后一个索引是什么? a) x-1 b) 程序员定义的?

C - 从左到右镜像 PPM

c - 结构输出显示错误

c - For 循环交替 printf

C - 列出当前目录中的所有文件,然后移动到上面的目录,列出文件,依此类推,直到到达根目录

C 程序未完成所有步骤

c - 在结构中声明数组

c++ - 设计题: How can I maintain a stack of object