2013-03-30 57 views
4

在給定的c代碼片段中,線 int *count = (int *)calloc(sizeof(int), 256);的等效代碼是什麼?calloc的等效代碼

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的情況下執行此操作?我們如何使用malloc和C++中的new來聲明它?

+1

你爲什麼要用'malloc'和'new'?它們是分配內存的替代方式,您不要一起使用它們。 –

+0

@BenVoigt +1,你最肯定不會用'new'分配'free'內存! –

+1

我知道malloc和new是不同的。我想知道如何使用malloc分配這段代碼並使用new。 – nathan1138

回答

7

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版本或在C++中使用new所需的版本刪除當時(但不早)的內存。

+0

感謝您的回覆! – nathan1138

+0

這行代表什麼意思?std :: vector count(std :: numeric_limits :: max()); – nathan1138

+0

@ sbala_20你問什麼'vector '是?或者'numeric_limits :: max()'是什麼? –

8

這將撥出256個整數,並且value-initialize數組0

這做什麼calloc在你的代碼在做什麼。

int *count = new int[256](); 
//      ^^ value-initialization 
+1

是的,它會導致*值初始化*,對於'int'則意味着用'0'填充。 –

+0

我比malloc + memset更喜歡這個,因爲這是更多的C++風格 – math

2

calloc是作爲malloc相同接着memset

+0

calloc和malloc或多或少是相同的,但calloc在C++中不存在。 calloc將初始化變量,而malloc不會初始化變量。 – nathan1138

+2

@ sbala_20 - 'calloc'是C++標準庫的一部分。 –

+0

感謝您的信息。但是當我爲我的面試準備時,我讀到了coc中沒有calloc。 – nathan1138