質問
gcc 4.3.3 でコンパイルされたこの C コードがあるとします。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
int * i;
i = (int *) malloc(sizeof(int));
printf("%d\n", *i);
return 0;
}
出力は、malloc() が返すメモリ内の内容であると予想しますが、代わりに出力は 0 です。malloc は返すメモリをゼロにしていますか?もしそうなら、なぜですか?
解決
malloc
自体はメモリをゼロにしませんが、多くのオペレーティングシステムは、セキュリティ上の理由でプログラムが要求するメモリをゼロにします(1つのプロセスが、別のプロセスによって使用された潜在的に機密情報)。
他のヒント
malloc()
関数は、割り当てられたメモリを特定の値に設定しません。メモリがゼロであることを確認する場合は、 calloc()
または同等のものを使用します。それ以外の場合は、前にあったものは何でも取得できます(この場合、ゼロになる可能性があります)。
割り当てられたメモリの値は公式には定義されていません。 C99の状態: malloc関数は、サイズがサイズで指定され、値が不定であるオブジェクトにスペースを割り当てます。これは意図的なものであるか、実装の副作用である可能性があります。または、たまたま多くのメモリが0になっている可能性があります。
OS XでAppleのgcc 4.0.1を使用してFWIWを実行すると、多くの割り当てを行っても0にならない。
for( idx = 0; idx < 100000; idx++ ) {
i = (int *) malloc(sizeof(int));
printf("%d\n", *i);
}
Mallocはメモリを一杯にする必要はありません。パフォーマンス上の理由から、リリースバージョンは多くの場合メモリを使用しません。 「安全な」ライブラリには、メモリをクリアするmalloc実装があります。ライブラリの実装者次第です。 このstackoverflowトピックで説明。
絶対に 0 であることに依存することはできません。より大きなチャンクを malloc し、ダンプして確認します。
そのintかどうか。 int = 0;またはint = 00000000;メモリ内の同じスペースを占有します。多くの場合、printfは最初の0を文字列の他の要素に関係なくnullターミネータとしてキャッチします。文字列コンパレーターを使用していて、0がプレースホルダーである場合、文字列ベースのライブラリが本当に悪いので、そのプレースホルダーには0を使用することをお勧めします。 Fを試してから、必要に応じてヌルの用語または改行を挿入して自分でコントロールを記述し、より移植性を高めます。