13

与えられた 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 を使用してこれを宣言するにはどうすればよいでしょうか?

4

3 に答える 3

12

calloc基本的には、すべてのデータを 0 バイトに設定するのと同じですmallocmemset

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 バージョンまたはnewC++ を使用するバージョンで必要とされるように、その時点で (ただしすぐには) メモリを削除する必要がなくなります。

于 2013-03-30T21:09:55.543 に答える
10

これにより、256 個の int が割り当てられ、配列が値で初期化されます。0

これはcalloc、コードで行っていることを行います。

int *count = new int[256]();
//                       ^^ value-initialization
于 2013-03-30T21:07:15.320 に答える
2

callocmallocが続くのと同じですmemset

于 2013-03-30T21:07:18.083 に答える