std::calloc
提供: cppreference.com
ヘッダ <cstdlib> で定義 | ||
void* calloc(std::size_t num, std::size_t size ); | ||
サイズ size
のオブジェクト num
個の配列用のメモリを確保し、全ビットをゼロに初期化します。
確保が成功した場合は、あらゆるオブジェクト型に対して適切にアラインされた、確保されたメモリブロックの最も低位の (最初の) バイトを指すポインタを返します。
size
がゼロの場合、動作は処理系定義です (ヌルポインタが返されるかもしれませんし、記憶域にアクセスするためには使用できない何らかの非ヌルなポインタが返されるかもしれません)。
以下の関数はスレッドセーフであることが要求されます。
記憶域の特定の単位を確保または解放するこれらの関数の呼び出しは単一の全順序で発生し、そのような解放の呼び出しそれぞれはこの順序における次の確保 (もしあれば) に対して先行発生します。 | (C++11以上) |
目次 |
[編集]引数
num | - | オブジェクトの数 |
size | - | 各オブジェクトのサイズ |
[編集]戻り値
成功した場合は、新たに確保されたメモリの先頭を指すポインタを返します。 メモリリークを回避するためには、返されたポインタは std::free() または std::realloc()
で解放しなければなりません。
失敗した場合は、ヌルポインタを返します。
[編集]ノート
アライメント要件のため、確保されるバイト数は num*size
と等しいとは限りません。
全ビットゼロの初期化は浮動小数点数やポインタがそれぞれ 0.0 やヌルポインタ値に初期化されることを保証しません (すべての一般的なプラットフォームで真ではありますが)。
元々 (C89 で)、サイズゼロに対するサポートは以下のようなコードに対応するために追加されました。
OBJ *p = calloc(0, sizeof(OBJ));// "zero-length" placeholder ... while(1){ p = realloc(p, c * sizeof(OBJ));// reallocations until size settles ... // code that may change c or break out of loop}
[編集]例
Run this code
#include <iostream>#include <cstdlib> int main(){int* p1 =(int*)std::calloc(4, sizeof(int));// allocate and zero out an array of 4 intint* p2 =(int*)std::calloc(1, sizeof(int[4]));// same, naming the array type directlyint* p3 =(int*)std::calloc(4, sizeof *p3);// same, without repeating the type name if(p2)for(int n=0; n<4;++n)// print the arraystd::cout<<"p2["<< n <<"] == "<< p2[n]<<'\n'; std::free(p1);std::free(p2);std::free(p3);}
出力:
p2[0] == 0 p2[1] == 0 p2[2] == 0 p2[3] == 0
[編集]関連項目
calloc の C言語リファレンス |