【问题标题】:Make Realloc behave like Calloc使 Realloc 表现得像 Calloc
【发布时间】:2014-05-02 16:48:37
【问题描述】:

如何强制 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
     }
   }
 }

当我执行它时,表会正常增长,并且其中的大部分“桶”被初始化为 NULL ptr。然而,并不是所有的都是。

如何让 Realloc 表现得像 calloc?从某种意义上说,当它创建新的“桶”时,它们初始化为 NULL

【问题讨论】:

  • 调用 ::memset 清除重新分配内存的多余部分?

标签: dynamic initialization dynamic-memory-allocation realloc calloc


【解决方案1】:

严格来说,您不应该依赖calloc(或memset,就此而言)将指针设置为空。 C doesn't guarantee 空指针在内存中由全零字节表示。

引用comp.lang.C FAQ question 7.31:

不要过度依赖calloc的零填充(见下文);通常,最好自己初始化数据结构,逐个字段,特别是如果有指针字段。

calloc 的零填充是所有位为零,因此保证为所有整数类型(包括字符类型的'\0')产生值 0。但它确实保证有用的空指针值(参见此列表的5 部分)或浮点零值。

自己初始化各个结构字段更安全。您可以创建一个static const 作为模板,将其content 初始化为NULL,然后将memcpy 初始化为动态分配数组的每个元素。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2011-07-03
    • 2020-07-28
    • 2019-06-05
    • 2021-06-28
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多