2017-03-27 11 views
2

malloc関数は、いくつかの変数にはmallocとreallocの

------------- 
|  p  | 
------------- 

をヒープのいくつかの連続した部分を取り、この場合にはどうなりますか再びmalloc関数は、他のいくつかのポインタに

------------- ----------------- 
|  P  |  S   | 
------------- ----------------- 

をたまたま今、reallocのは、pのために起こります

------------------- ----------- 
|  p   | S  | 
------------------- ----------- 

Sスペースが縮小されますか?それは起こるか?私はこのようなプログラムを実行した

は、

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
int *p; 
char *s; 
p = malloc(sizeof(*p)); 
printf("1:p points to %p\n", (void *)p); 
//printf("1:p points to %p\n", (void *)(p+1)); 
s = malloc(sizeof(*s)); 
printf("1:s points to %p\n", (void *)s); 
p = realloc(p, sizeof(*p)*2); 
printf("2:p+2 points to %p\n", (void *)(p+2)); 
p = realloc(p, sizeof(*p)*7); 
printf("3:p points to %p\n", (void *)(p)); 
printf("3:p+7 points to %p\n", (void *)(p+7));//should run over s's memory 
printf("2:s points to %p\n", (void *)s); 
free(p); 
p = NULL; 
free(s); 
s = NULL; 
return 0; 
} 
output: 
1:p points to 0x1291010 
1:s points to 0x1291030 
2:p+2 points to 0x1291018 
3:p points to 0x1291050 --> location of p pointed to by p is changed. 
3:p+7 points to 0x129106c 
2:s points to 0x1291030 

だから、最初のmallocは自分自身では0x20 = 32バイトを与えました? 0x1291030 - 0x1291010 = 0x20 = 32バイト。

「p」が指すメモリのサイズが増え続けると、私はsの指摘されたメモリにつながり、次にpを使ってsにアクセスできますか?

P.S

正しく私が言いたかった何を言って質問を編集しました。 reallocは、sのメモリが踏み込まれると脅かされると、他の場所をメモリに割り当てます。出力がはっきりと見えます。

+0

'realloc'は元のアドレスを保持することは保証されていません。それは他の場所に大きな領域を割り当て、Pの内容をビット単位でコピーします。 – StoryTeller

+0

'realloc'は新しいメモリへのポインタを返します(古い内容にコピーした場所)。ヒープは、reallocに対処するための割り当て後に領域を予約することができます。 「ビット」は割り当てられず、バイトのみが割り当てられ、おそらく適切には4または8バイトの境界に割り当てられます。 –

+0

あなたは 'realloc'について話しますが、あなたのコードでは' calloc'を使い、最初の割り当ては決して 'フリー'にしないでください。私はあなたの推論から意味をなさないように奮闘します。 –

答えて

2

mallocの定義済みの「最小割り当て単位」はありません。これは実装定義です。また、mallocがブックキーピングの目的でどれだけのメモリを使用しようとしているかによって異なります。

reallocに関して、reallocは、新たに要求されたサイズに割り当てるために連続したスペースがある場合、同じアドレスを返します。そうでない場合は、他のアドレスからメモリを割り当てて返すでしょうし、元のポインタが指すメモリを解放します。

一度割り当てられたスペースは、ユーザーがリクエストしなくてもサイズ変更されない、つまり質問で「S」のスペースが自動的に縮小またはサイズ変更されることはありません。

+0

質問に間違いを犯して編集しました。どうやらあなたの答えの挙動が示されていて、私が自分自身を正しくチェックしていれば、この質問は決して聞かれてはいけません。 – acidlategamer

3

これはすべて実装定義されているため、一般的に推論することは不可能です。

もちろん、realloc()は1つのポインタには、malloc()やその他の割り当て関数の呼び出しによって返されたメモリには影響しません。これはrealloc()は、結果のポインタを返す理由、それはあなたが渡されたものとは異なる可能性がある。

インナーmalloc()の仕組みや友人がアロケータに依存し、多くのアロケータがあります。標準ライブラリの選択肢に同意しない場合は、他の実装を使用して回避できます。また

、この:

int *p; 
p = malloc(sizeof(p)); 

はほとんど意味がありません、あなたはポインタのポイントでデータのサイズと同じではありませんポインタのサイズを割り当てている(すなわち整数) 。これを行うには、あなたが使用する必要があります。

p = malloc(sizeof *p); 

を最後に、正しい%pでポインタを印刷している間、それはvoid *のための唯一の正しいだと可変引数システムが把握していないので、何の自動変換はありません。 void *にキャストするか、未定義の動作が発生します。

+0

がsizeof(* p)に変更されました。 – acidlategamer

1

再割り当てに十分なスペースがない場合、pのメモリ位置が変更されます。あなたが見せていることは決して起こりません。

関連する問題