如何强制Realloc像calloc一样? 例如:
我有以下结构:
typedef struct bucket0{
int hashID;
Registry registry;
}Bucket;
typedef struct table0{
int tSize;
int tElements;
Bucket** content;
}Table;
我有以下代码来增长表格:
int grow(Table* table){
Bucket** tempPtr;
//grow will add 1 to the number available buckets, and double it.
table->tSize++; //add 1
table->tSize *= 2; //double element
if(!table->content){
//table will be generated for the first time
table->content = (Bucket**)(calloc(sizeof(Bucket*), table->tSize));
} else {
//realloc content
tempPtr = (Bucket**)realloc(table->content, sizeof(Bucket)*table->tSize);
if(tempPtr){
table->content = tempPtr;
return 0;
}else{
return 1000;//table could not grow
}
}
}
当我执行它时,表格会正常生长,而且大多数情况下都是“桶”和“#34;在它中初始化为NULL ptr。但是,并非所有这些都是。
如何让Realloc表现得像calloc?从某种意义上说,当它创造新的"水桶"他们初始化为NULL
答案 0 :(得分:0)
严格来说,您不应该依赖calloc
(或memset
来设置指针)。空指针的C doesn't guarantee由内存中的全零字节表示。
引用comp.lang.C FAQ question 7.31:
不要过分依赖
calloc
的零填充(见下文);通常,最好在逐个字段的基础上自己初始化数据结构,尤其是在有指针字段的情况下。
calloc
的零填充是全位 - 零,因此保证为所有整数类型(包括字符类型的'\0'
)产生值0。但它确实不保证有用的空指针值(参见本列表的5部分)或浮点零值。
自己初始化单个结构字段更安全。您可以创建一个static const
作为模板,其content
初始化为NULL
,然后memcpy
为动态分配数组的每个元素。