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

我是否在C中正确初始化自定义结构?,c,struct,malloc,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 element

因此,我有以下结构:

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

代码看起来不错,但在
initialVariableVector->variables
中没有初始化值。 另外,尝试使用而不是
malloc()
,它用零填充内存块。 例如:

VariableVector* initialVariableVector = (VariableVector*) calloc (1, sizeof(VariableVector));

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

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编程进行代码审查。投票关闭。当除一个元素外的所有元素都被设置为非零值时,使用
calloc
没有意义。那么
initialVariableVector->variables
初始化呢?也许我错了,但我想我们必须用零填充
变量
结构的所有值,以防止将来出现错误。
calloc
可能适合也可能不适合分配给
变量
,这取决于数组的每个元素在投入使用时需要设置什么。对于我们所拥有的代码,没有理由认为将内容设置为零必然会防止bug或节省时间。例如,如果数组中小于等于
size
的每个元素都必须包含有效指针(非空),因为存在解引用它们的代码,那么使用
calloc
而不是
malloc
只会浪费时间。好吧,我同意你的看法,但根据这里的评论,
malloc()之间的调用时间没有太大差异
calloc()
,因为操作系统可能已经用零填充了内存块。当
malloc
calloc
必须从操作系统获取新内存时,出于安全目的,一般消费者使用的操作系统当然有义务擦除其提供的内存中的数据,如果该内存可能包含数据,则进程不应包含该数据。但是,
malloc
calloc
通常会在从操作系统请求更多内存之前重用以前释放的内存。在这些情况下,
malloc
没有义务擦除数据。此外,操作系统可能有一些优化,允许它在知道没有问题的情况下提供未擦除的内存。