void *
を返す標準ライブラリ関数なんて数えるほどしかないと思います。ということで、n1570(C11最終ドラフト)のAnnex Bで検索してみました。C11での標準ライブラリになります。
<stdlib.h>
C
1void *aligned_alloc(size_t alignment, size_t size);
alignment
で指定した境界サイズでアライメントされます。
C
1void *calloc(size_t nmemb, size_t size);
2void *malloc(size_t size);
3void *realloc(void *ptr, size_t size);
どんなオブジェクトでも可能なように標準的な境界サイズでアライメントされます。
C
1void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
2 int (*compar)(const void *, const void *));
3void *bsearch_s(const void *key, const void *base, rsize_t nmemb, rsize_t size,
4 int (*compar)(const void *k, const void *y, void *context), void *context);
size
で配列の要素サイズを指定しており、このサイズの境界のポインタを返します。
<string.h>
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
void *memmove(void *s1, const void *s2, size_t n);
void *memset(void *s, int c, size_t n);
返り値は第一引数のs1
またはs
であり、元々の境界から変更はありません。
void *memchr(const void *s, int c, size_t n);
バイト単位で文字を探すため、1バイト区切りの境界で返ることになります。バイト検索ですので、char
等のバイト単位として取り扱うべきでしょう。
<threads.h>
void *tss_get(tss_t key);
対になるtss_set()
でセットしたポインタを返すため、セットしたポインタの境界になります。
ということで、質問の「適切に境界調整(アライメント)された値を返すこと」が「どんなオブジェクトのポインターにもキャスト可能なようにアライメントされていること」と言う意味であれば、答えは"NO"です。しかし、「その関数の動作の意味を踏まえて使用した場合、期待されるオブジェクトのポインターとしてキャスト可能なようにアライメントされていること」であれば、答えは"YES"です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/13 13:55