c - 我是否在 C 中正确初始化了自定义结构?

标签 c struct malloc

所以我有以下结构:

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

struct _VariableVector {
    int size; // elements full in array
    int capacity; // total available elements
    Variable *variables;
};
typedef struct _VariableVector VariableVector;

这是实现 VariableVector 的正确方法吗?

VariableVector* initVariableVector() {
    VariableVector* initialVariableVector = malloc(sizeof(VariableVector));
    if (initialVariableVector != NULL ) {
        initialVariableVector->size = 0;
        initialVariableVector->capacity = VECTOR_INITIAL_CAPACITY;
        initialVariableVector->variables = malloc(
                sizeof(Variable) * VECTOR_INITIAL_CAPACITY);
    }
    return initialVariableVector;
}

最佳答案

通常的做法是将指向结构的指针传递给初始化程序,而不是返回指向您尝试初始化的结构的指针。这将使您避免不必要的动态内存分配(这是错误的常见来源),并初始化自动内存中的结构或其他结构的一部分:

int initVariableVector(VariableVector* initialVariableVector) {
     // initialise everything to zero first
    memset(initialVariableVector, 0, sizeof(initialVariableVector));

    initialVariableVector->capacity = VECTOR_INITIAL_CAPACITY;

    if (NULL == (initialVariableVector->variables = calloc(
                sizeof(*initialVariableVector->variables) , VECTOR_INITIAL_CAPACITY))
    )
        return -1; // indicate an error

    return 0; // all good
}

然后调用它

VariableVector my_var_vector;
if (initVariableVector(&my_var_vector)) {
    perror("initVariableVector");
    abort();
}

关于c - 我是否在 C 中正确初始化了自定义结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146340/

相关文章:

C++检查变量以解决越界问题

c++ - 指向单链表中内存地址的指针,其中没有变量表示每个元素

c - 编码/解码程序的逻辑错误 (C)

c - 子结构最终包含错误的成员

c - 什么情况下malloc可以返回NULL?

c# - 使用带有 c dll 的后台工作程序

c - 为结构体赋值

C Union,结构内数组的填充

linux - 关于glibc中malloc实现的问题

c - malloc - 系统调用 - 它是如何制作的?