配列を次のように初期化する簡単なプログラムがあります。
int a[]={10,20,30,40,50};
char *p;
p=(char*)a;
次に、ポインタを介して各バイトの値にアクセスしますp
。そのために私は知る必要があります:配列はどのようにメモリに保存されますか?スタックまたはヒープに格納されていますか?
配列を次のように初期化する簡単なプログラムがあります。
int a[]={10,20,30,40,50};
char *p;
p=(char*)a;
次に、ポインタを介して各バイトの値にアクセスしますp
。そのために私は知る必要があります:配列はどのようにメモリに保存されますか?スタックまたはヒープに格納されていますか?
配列は、その要素を連続したメモリ位置に格納します。
アレイをローカルで作成した場合、それはスタック上にあります。要素が格納される場所は、ストレージの仕様によって異なります。
例:
グローバルまたは静的に宣言されたアレイは、ローカルで宣言されたアレイとは異なるストレージ仕様を持ちます。技術的には、where部分は実装で定義されていますが、通常、実装は同様の使用パターンを使用します。
まだコメントを追加できないので、回答の 2 セントを以下に示します。
メモリがスタック上にあるかヒープ上にあるかだけを知りたい場合は、他の回答を読んでください。彼らは私よりもはるかに詳しいです。
値がどこにあるかを正確に知りたい場合は、いつでもアドレスを出力できます。
printf("address at a[0] = %p\n", (void *)&a[0]);
printf("address at p[0] = %p\n", (void *)&p[0]);
どこで同じ答えに気付くでしょう。しかし、それから見てください
printf("address at a[1] = %p\n", (void *)&a[1]);
printf("address at p[1] = %p\n", (void *)&p[1]);
これは楽しい小さなエクササイズです。楽しみのために、次のコードを実行して結果を確認してください。
p[2] = 'a';
printf("a[0] is %d\n", a[0]);
printf("a[1] is %d\n", a[1]);
printf("p[2] is %d\n", p[2]);
putchar(p[2]);
静的に作成された配列は、スタック上またはバイナリの.data
/セクションにあります。.bss
動的に作成された配列 (new
またはを使用malloc
) がヒープに割り当てられます。
まず、ポインタは int 型である必要があります。配列は単なる整数のグループであり、単一の整数としてメモリに保存されますが、1 行です。整数はメモリ内に 4 バイトあるため、ポインタを 4 ずつ増やすことで配列の各値にアクセスできます。
int *p = (int*)a;
for(i = 0; i < 5; i++) {
p += 4;
printf("%d ", *p);
}