12

配列を次のように初期化する簡単なプログラムがあります。

int a[]={10,20,30,40,50};   
char *p;
p=(char*)a;

次に、ポインタを介して各バイトの値にアクセスしますp。そのために私は知る必要があります:配列はどのようにメモリに保存されますか?スタックまたはヒープに格納されていますか?

4

4 に答える 4

33

配列は、その要素を連続したメモリ位置に格納します。
アレイをローカルで作成した場合、それはスタック上にあります。要素が格納される場所は、ストレージの仕様によって異なります。
例:
グローバルまたは静的に宣言されたアレイは、ローカルで宣言されたアレイとは異なるストレージ仕様を持ちます。技術的には、where部分は実装で定義されていますが、通常、実装は同様の使用パターンを使用します。

  • ローカル配列は(通常)スタック上に作成されますが、
  • グローバルまたは静的配列は、(通常)bss/dataセグメント上に 作成されます。
  • 動的に作成された配列がヒープ上に作成されます
于 2012-05-22T05:14:11.523 に答える
7

まだコメントを追加できないので、回答の 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]);
于 2012-05-22T05:45:49.247 に答える
3

静的に作成された配列は、スタック上またはバイナリの.data/セクションにあります。.bss動的に作成された配列 (newまたはを使用malloc) がヒープに割り当てられます。

于 2012-05-22T05:15:15.380 に答える
-3

まず、ポインタは int 型である必要があります。配列は単なる整数のグループであり、単一の整数としてメモリに保存されますが、1 行です。整数はメモリ内に 4 バイトあるため、ポインタを 4 ずつ増やすことで配列の各値にアクセスできます。

int *p = (int*)a;
for(i = 0; i < 5; i++) {
    p += 4;
    printf("%d ", *p);
}
于 2012-05-22T05:17:13.540 に答える