2012-01-10 13 views
-1

を使用して変更ここでは、コードスニペットです:ポインタアドレスはmallocの

void main() { 
    int i,*s; 
    for(i=1;i<=4;i++) { 
     s=malloc(sizeof(int)); 
     printf("%lu \n",(unsigned long)s); 
    } 
} 

私のCOMPのint型のサイズは2バイトなので、16ビットずつ増加いけないのprintfコマンドprintアドレス、代わりにそれがアドレスを出力します次のようになります。

2215224120 
2215224128 
2215224136... 

どうしてですか?

+0

'malloc'はあなたのアドレス空間全体にアドレスを返します。 – Mat

+0

プロセッサアーキテクチャとは何ですか? 'malloc'は誰ですか? –

+0

@Matによれば、mallocから返されるアドレスについては何も仮定することはできません。通常、最小整列と最小サイズの割り当てがありますが、あなたの場合は8バイトに見えます。 –

答えて

1

malloc()は、このような保証を提供していません。独自のメモリ管理の決定に従ってメモリを割り当てて、そのメモリへのポインタを返します。実際、多くの実装では、ポインタがメモリ管理メタデータのために返される直前に余分なメモリを使用します。

0

あなたは住所のパターンについて何も保証していませんmallocあなたに戻ってきます。

+0

特定のプラットフォーム –

2

呼び出されたアラインメント。ほとんどのCPUは、いくつかの境界線、通常は4または8のメモリを揃えなければなりません。アドレスを誤って配置すると、セグメンテーションエラーまたはバスエラーが発生します。

5

どのようにメモリを管理するかは、オペレーティングシステムによって異なります。それはどこからでもメモリを割り当てることができますが、メモリがどこにあるかについては絶対に仮定することはできません。

ほとんどのメモリアロケータにもオーバーヘッドがあるため、単純な2バイトアロケーションでも8バイト以上かかることがあります。さらに、アドレスは、パフォーマンスのようないくつかの理由で整列する必要があります。また、整列していないアドレスから読み込むときにCPUがクラッシュすることもあります。

ボトムライン - mallocからの戻り値をそのままとって、推測や推測をしないでください。

+1

+1の最小アライメントとは別に保証はありません。私は、簿記やアラインメントのオーバーヘッドが通常少なくとも2倍以上を食べるので、4バイトまたは8バイトブロックの割り当てを勧めます。 –

+0

絶対に。もちろん、ミニ割り当て用に設計された独自の特化型アロケータを作成しない限り、しかし、通常の生活では、その小さな割り当ては多くの理由で悪いです。 – EboMike

+0

助けてくれてありがとう – Akash

1

malloc()は、基礎となるハードウェア、OS、ドライバなどを抽象化します。メモリ割り当てパターンは、さまざまなパラメータによってマシンごとに異なる場合があります。

しかし、次は常に正しい程度malloc()

  1. malloc()機能がsizeバイトを割り当て、割り当てられたメモリへのポインタを返すままいくつかのことです。
  2. メモリが初期化されていません。
  3. sizeが0の場合、malloc()NULLまたは後でfree()に正常に渡すことができる一意のポインタ値のいずれかを返します。
  4. malloc()は、任意の種類の変数に対して適切に整列された割り当てられたメモリへのポインタを返します。エラーの場合は、NULLを返します。
  5. NULLもサイドノートでzero

のサイズでmalloc()に成功した呼び出しによって返されることがあり 、あなたは次のように私はプログラムを修正

ポインタ

を印刷するための %p書式指定子を使用することができます

#include <stdlib.h> 

int main(void) { 
    int i,*s; 
    printf("sizeof(int) = %zu \n", sizeof(int)); 

    for(i=1;i<=4;i++) { 
     if ((s=malloc(sizeof(int))) == NULL) { 
      printf("unable to allocate memory \n"); 
      return -1; 
     } 
     printf("%p \n",s); 
    } 

    return 0; 
} 

出力は以下の通りである:

$ ./a.out 
sizeof(int) = 4 
0x9d5a008 
0x9d5a018 
0x9d5a028 
0x9d5a038 
$ 
+0

* malloc()は、割り当てられたメモリへのポインタを返す。* SSEは16バイトのアライメントを必要とするが、Win32/Linuxのmallocは通常8バイト整列。 –

+0

@PaulRそれは良い点です!ありがとう! –

+0

-1 mallocの結果をC言語に型キャストする場合は、決して実行しないでください。 [C FAQ](http://c-faq.com/malloc/mallocnocast.html)。 – Lundin