2009-10-25 5 views
14

は、gccでコンパイル4.3.3mallocはメモリをゼロにしますか?この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関数はメモリをゼロそれは返す?もしそうなら、なぜですか?

+3

このデバッグまたはリリースはありますか? – ChrisF

+0

あなたが期待しているのは、このケースです。 malloc()が返すメモリ内にあったものを出力します。これは0になりました。 –

答えて

30

malloc自体はメモリをゼロにしませんが、多くのオペレーティングシステムでは、セキュリティ上の理由からプログラムが要求するメモリがゼロになります(別のプロセスで使用されていた機密情報にアクセスする可能性があります)。

+0

ありがとう、これは特定の答えを探すためのどこかに私を与える! – endeavormac

+6

標準で* mallocがメモリをゼロにするのを防ぐものは何もないことに言及しておきます。効率化のために、通常は*これは必須ではありませんが、必須ではありません。 – paxdiablo

+15

また、OSからの新しいメモリがゼロになる可能性がありますが、アプリケーションが以前使用していたメモリをリサイクルすると、ゼロにならない可能性があります。だからこれに頼ることについても考えないでください:) – bdonlan

7

malloc()関数は、割り当てられたメモリを特定の値に設定しません。メモリがゼロであることを確認する場合は、calloc()または同等のものを使用してください。それ以外の場合は、以前に何があったかを取得します(あなたの場合はゼロかもしれません)。

+0

一貫して0ではないと私は期待しています。なぜ、何度も何度も何度も何度も値を取得するのですか? – endeavormac

+2

あなたは同じ方法で同じプログラムを繰り返し実行しており、異なる結果が予想されますか? 'malloc()'自体がメモリをゼロにすることは保証されていませんが、OSはあなたのプログラムを読み込んで実行するように同じ作業をしています。ランタイムライブラリコードは、ヒープメモリを設定してコードを実行するために同じことをしています。別の答えで述べたように、OSは、異なるプロセスを互いに分離するために、ある特定の値に初期化された新しいメモリページを与える可能性が高い。 –

+0

プログラムがOSから新しいメモリを要求しています。 OSは最初にプロセスに割り当てられたときにメモリをゼロにします。ランダムな値を入力して、その値を空にして、別の値を割り当ててください。 – nos

1

あなたは間違いなくそれが0であることに依存することはできません。 mallocより大きいチャンクとそれを見るためにダンプします。

1

割り当てられたメモリの値は正式には定義されていません。 C99の状態:The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc()は、それをゼロ化することを含め、必要な処理を行うことができます。これは意図的なものか、実装の副作用なのか、それとも0になるようなメモリが多すぎるかもしれません。

Apple社のgcc 4.0.1でFWIW on OS X 4.0.1私はそれを出せません

for(idx = 0; idx < 100000; idx++) { 
    i = (int *) malloc(sizeof(int)); 
    printf("%d\n", *i); 
} 
+0

* iを0以外に設定して、iを解放してから、もう一度mallocして何が得られるかを確認してください。 –

+0

プロセスに最初に割り当てられるメモリは、セキュリティ上の理由からゼロに設定されているため、メモリをmallocして、別のプロセスが書き込んだ情報を見つけることはできません。 – gnasher729

+0

@ gnasher729これは特定のCコンパイラが行うものかもしれませんが、保証はありません*これが該当し、依存してはいけません。 – Schwern

2

Mallocはメモリをいっぱいにする必要はありません。パフォーマンス上の理由から、リリースバージョンではメモリを使用しないことがよくあります。 「安全な」ライブラリには、メモリをクリアするmalloc実装があります。これはライブラリ実装者の責任です。 explained in this stackoverflow topicである様々なコンパイラのデバッグライブラリによってメモリに書き込まれるいくつかの一般的なパターンがあります。

関連する問題