在给定的c代码片段中,int *count = (int *)calloc(sizeof(int), 256);行的等效代码是什么?
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来声明这一点?
发布于 2013-03-31 05:09:56
calloc基本上等同于malloc,然后是memset,将所有数据设置为0字节:
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提供了一种语法,使您可以更简单地执行此操作:
int *count = new int[256]();请注意末尾的括号。但是,还要注意的是,您通常根本不想在C++中这样做--您通常希望编写如下代码:
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的版本中需要删除内存时(但不会更快)。
发布于 2013-03-31 05:07:15
这将分配256个int,并将数组value-initialize到0
这就是calloc在代码中所做的事情。
int *count = new int[256]();
// ^^ value-initialization发布于 2013-03-31 05:07:18
calloc与malloc相同,后跟memset
https://stackoverflow.com/questions/15723445
复制相似问题