我是否在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
没有义务擦除数据。此外,操作系统可能有一些优化,允许它在知道没有问题的情况下提供未擦除的内存。