首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >calloc的等效代码

calloc的等效代码
EN

Stack Overflow用户
提问于 2013-03-31 05:01:51
回答 3查看 8.4K关注 0票数 11

在给定的c代码片段中,int *count = (int *)calloc(sizeof(int), 256);行的等效代码是什么?

代码语言:javascript
复制
int *getCharCountArray(char *str)
{
   int *count = (int *)calloc(sizeof(int), 256);
   int i;
   for (i = 0; *(str+i);  i++)
      count[*(str+i)]++;
   return count;
}

是否有可能在不使用calloc的情况下做到这一点?我们如何在c++中使用malloc和new来声明这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-31 05:09:56

calloc基本上等同于malloc,然后是memset,将所有数据设置为0字节:

代码语言:javascript
复制
void *like_calloc(size_t size, size_t num) { 
    void *ret = malloc(size * num);

    if (ret)  
        memset(ret, 0, size * num);
    return ret;
}

C++为new提供了一种语法,使您可以更简单地执行此操作:

代码语言:javascript
复制
int *count = new int[256]();

请注意末尾的括号。但是,还要注意的是,您通常根本不想在C++中这样做--您通常希望编写如下代码:

代码语言:javascript
复制
std::vector<int> getCharCountArray(unsigned char const *str) { 
     std::vector<int> count(std::numeric_limits<unsigned char>::max()+1);

     for (int i=0; str[i]; i++)
         ++count[str[i]];
     return count;
}

这显然在一定程度上简化了代码,但也有比直接显而易见的更多的简化。具体地说,这避免了代码的其余部分必须跟踪何时不再需要返回值,以及在C版本或C++中使用new的版本中需要删除内存时(但不会更快)。

票数 11
EN

Stack Overflow用户

发布于 2013-03-31 05:07:15

这将分配256个int,并将数组value-initialize0

这就是calloc在代码中所做的事情。

代码语言:javascript
复制
int *count = new int[256]();
//                       ^^ value-initialization
票数 10
EN

Stack Overflow用户

发布于 2013-03-31 05:07:18

callocmalloc相同,后跟memset

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15723445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档