我怎么能强迫Realloc行为像callloc ?例如:
我有以下结构体:
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
}
}
}
当我执行它时,表正常增长,并且其中的大多数"bucket"初始化为NULL ptr。然而,并不是所有的都是。
如何使Realloc表现得像calloc?当它创建新的"桶"时,它们初始化为NULL
严格来说,您不应该依赖calloc
(或memset
)将指针设置为null。C不保证空指针在内存中由全零字节表示。
引用自comp.lang.C FAQ问题7.31:
不要太依赖
calloc
的零填充(见下图);通常,最好自己逐个字段地初始化数据结构,特别是在有指针字段的情况下。
calloc
的零填充是全位零,因此保证对所有整型(包括字符类型的' '
)产生值为0。但是不能保证有用的空指针值(参见本列表的第5节)或浮点零值。
自己初始化单个结构字段更安全。您可以创建一个static const
作为模板,将其content
初始化为NULL
,然后将memcpy
初始化为动态分配数组的每个元素。