2013-03-30 2 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 и new в C++?

+1

Зачем вам использовать 'malloc' AND' new'? Это альтернативные способы выделения памяти, вы не используете их вместе. –

+0

@BenVoigt +1 и вы НЕ МОЖЕТЕ НЕ «освобождать» память, выделенную «новым»! –

+1

Я знаю, что malloc и новые разные. Я хочу знать, как выделить этот кусок кода с помощью malloc, а также использовать новый. – 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; 
} 

С ++ обеспечивает синтаксис 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, либо с версией, использующей new в C++.

+0

Спасибо за ваш ответ! – nathan1138

+0

Что означает эта строка? Std :: vector count (std :: numeric_limits :: max()); – nathan1138

+0

@ sbala_20 Вы спрашиваете, что такое 'vector ' is? Или что такое 'numeric_limits :: max()' is? –

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

Спасибо за эту информацию. Но когда я готовлюсь к собеседованию, я читаю, что calloc там нет в C++. – nathan1138

Смежные вопросы