サイズが 0 の場合、memset() を null ポインターで呼び出すことはできますか? 質問する

サイズが 0 の場合、memset() を null ポインターで呼び出すことはできますか? 質問する

何らかの理由で、 のゼロ化バージョンを手動で作成したいと思いますmalloc()。アルゴリズムの複雑さを最小限に抑えるために、次のように記述します。

void * my_calloc(size_t size)
{
    return memset(malloc(size), 0, size);
}

これは の場合に適切に定義されていますか?ゼロ サイズで をsize == 0呼び出すことは問題ありませんが、これにより null ポインターが返される可能性があります。 のその後の呼び出しはOK でしょうか、それともこれは未定義の動作であり、条件 を追加する必要がありますか?malloc()memsetif (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 以外であることを期待していることを示しています。

おすすめ記事