何らかの理由で、 のゼロ化バージョンを手動で作成したいと思いますmalloc()
。アルゴリズムの複雑さを最小限に抑えるために、次のように記述します。
void * my_calloc(size_t size)
{
return memset(malloc(size), 0, size);
}
これは の場合に適切に定義されていますか?ゼロ サイズで をsize == 0
呼び出すことは問題ありませんが、これにより null ポインターが返される可能性があります。 のその後の呼び出しはOK でしょうか、それともこれは未定義の動作であり、条件 を追加する必要がありますか?malloc()
memset
if (size)
冗長な条件チェックは絶対に避けたいです。
今のところは失敗しないと仮定します。実際には、失敗したときに終了するmalloc()
手動バージョンも存在します。malloc()
このようなもの:
void * my_malloc(size_t size)
{
void * const p = malloc(size);
if (p || 0 == size) return p;
terminate();
}
ベストアンサー1
glibc 宣言は次のとおりです。
extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
は__nonnull
、ポインタが null 以外であることを期待していることを示しています。