私はCプログラムのメモリ管理を学んでいます。私は良い疑いに着いた。 (UbuntuのOS)malloc()|スタックアドレスとヒープ位置のメモリアドレス長の差| Cプログラミング
マイ・ダウト:
私は、スタック内とヒープの両方内にあるデータのアドレスを知りたいと思いました。しかし、私はそれらのアドレスを印刷しようとしたとき、私はアドレスの長さが異なることを観察した! ここで、ヒープアドレスよりも長いスタックアドレスを表示するのはなぜですか?プロセスごとのスタックメモリは、固定およびヒープメモリよりも少ない
- :私が知っている
。
- のmalloc()メモリは、ヒープ
- ローカル変数に割り当てるあなたも私の疑問に答えることができるように私はここに私のデモコードを入れ
スタックに行きます。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr; // goes on stack
ptr = (int *)malloc(sizeof(int));
*ptr = 10; // 10 is stored on heap
printf("%p : heap address\n",ptr);
printf("%p: stack address\n",&ptr);
return 0;
}
出力: 私はだから今あなたは私が求めていますかを理解かもしれない、私の端末で出力
0x1ea2010 : heap address
0x7ffda62cb3c0: stack address
を以下ました。スタックアドレスの長さがヒープより長いのはなぜですか?ヒープは大きなメモリプールなので、明らかに長さは長くなければなりません。
スタックとヒープの割り当てが同じメモリブロックで行われている場合(現代のOSのように..どこかでこれを読んでいます)、同じ長さにする必要があります。
大丈夫です。私の記憶の概念を透明にするのを助けてください。
注:私の疑いが非常に単純または愚かな場合は、少なくとも私のデモコードと異なる長さのアドレスの背後にある魔法でどのようにメモリ割り当てが行われたか教えてください。
このような投稿をお読みいただきありがとうございます。ハッピーアンサーリング!
これらは、印刷している仮想アドレスだけです。ダイナミックリンクのためにメモリの実際の物理アドレスを特定することはできません。私が間違っているなら誰か私を修正してください。 –
'%p'変換タイプ指定子に関するC標準から:"ポインタの値は**実装定義の**方法で印刷文字列に変換されます。 "そして、この出力と内部表現を区別する必要があります。必要な標準への参照を提供してください。スタックアドレスはヒープアドレスより大きくてはいけません(または、スタックまたはヒープの必要条件があります)。 – Olaf
"スタックとヒープの割り当てが同じメモリブロックで行われた場合(現代のOSのように私はどこかでこれを読んだことがある)" - 不明瞭なサイトが書いているものはすべて信じられません。それは意味をなさない。あなたは明確にするために著者に尋ねるべきです。 – Olaf