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のメモリが踏み込まれると脅かされると、他の場所をメモリに割り当てます。出力がはっきりと見えます。
'realloc'は元のアドレスを保持することは保証されていません。それは他の場所に大きな領域を割り当て、Pの内容をビット単位でコピーします。 – StoryTeller
'realloc'は新しいメモリへのポインタを返します(古い内容にコピーした場所)。ヒープは、reallocに対処するための割り当て後に領域を予約することができます。 「ビット」は割り当てられず、バイトのみが割り当てられ、おそらく適切には4または8バイトの境界に割り当てられます。 –
あなたは 'realloc'について話しますが、あなたのコードでは' calloc'を使い、最初の割り当ては決して 'フリー'にしないでください。私はあなたの推論から意味をなさないように奮闘します。 –