在给定的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声明这个?
答案 0 :(得分:9)
这将分配256个整数,并将value-initialize数组分配给0
这可以解决calloc
在您的代码中所做的事情。
int *count = new int[256]();
// ^^ value-initialization
答案 1 :(得分:9)
calloc
基本上等同于malloc
后跟memset
将所有数据设置为零字节:
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]();
注意最后的parens。但是请注意,您通常不想要在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版本或使用new
的版本中根据需要删除内存(但不会更早)在C ++中。
答案 2 :(得分:2)
calloc
与malloc
相同,后跟memset