重複の可能性:
C では NULL は常にゼロですか?
C 標準では、 について次のように規定されていますcalloc()
。
calloc 関数は、それぞれのサイズが size である nmemb オブジェクトの配列にスペースを割り当てます。スペースは全ビット 0 に初期化されます。
すべてのビットがゼロに関連する次の注意事項があります。
これは、浮動小数点ゼロまたはヌル ポインター定数の表現と同じである必要はないことに注意してください。
テストプログラム:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char** list = calloc(10, sizeof(*list));
int i;
for (i = 0; i < 10; i++)
{
printf("%p is-null=%d\n", list[i], NULL == list[i]);
}
free(list);
return 0;
}
このプログラムをビルドし、次のコンパイラで実行しました。
- VC7、VC8、VC9、VC10
- gcc v4.1.2、gcc v4.3.4
- フォルテ5.8、フォルテ5.10
すべての場合において、すべてのビット 0はNULL
ポインターです (テスト プログラムで間違いを犯した場合を除きます)。
ポインターが C 標準ですべてのビットがゼロNULL
になることが保証されていない理由は何ですか? 好奇心から、すべてのビット 0がポインターではないコンパイラーはありますか?NULL