3

友人 私はいくつかのポインター プログラムをいじっていて、GCC (およびおそらく C 標準) が静的配列と動的配列を区別していることに気付きました。

動的配列には配列内の要素のアドレスのプレースホルダーがありますが、静的配列の場合、コンパイラーが要素配列の開始アドレスを格納するメモリー位置はありません。

私の混乱を示すためのサンプルプログラムがあります。

#include <iostream>
#int main(void)
{
  int _static[10];
  int *_dynamic;

  _dynamic = new int [10];

  std::cout<<"_static="<<_static<<" &_static="<<&_static<<" &_static[0]="<<&_static[0]<<std::endl;
  std::cout<<"_dynamic="<<_dynamic<<" &_dynamic="<<&_dynamic<<" &_dynamic[0]="<<&_dynamic[0]<<std::endl;

  return 0;
}

上記のプログラムの場合、予想される行で同じアドレス_staticを返します。&_static[0]ただし、&_staticも他の 2 つと同じアドレスを返します。

したがって、同じ番号 (または任意の名前のアドレス)_static&_static参照してください。予想どおり、異なる場所_dynamicを示します。&_dynamic

では、なぜ C 標準は同じ場所を参照する必要がある_staticと述べたのでしょうか。&_static紛らわしいですね。私が感じる理由の1つは&_static、あまり意味がないということです。しかし、その使用法は代わりにエラーとして報告されるべきではありませんか?

誰かがこの混乱を手伝ってくれませんか?

4

3 に答える 3

9

関数内の静的配列はスタックに割り当てられます。このように_static(最初のエントリへのポインタとして減衰)、同じ値、同じメモリ アドレス&_static[0]を持ちます。&_static

一方、動的配列は、実際には連続したメモリ領域へのポインタです。ポインタのみがスタックに格納されます。&_dynamicこれが、 (スタックから) と_dynamic(ヒープから) が異なる理由です。

この画像がすべてを示していることを願っています:

静的配列と動的配列

静的および動的グローバル配列に関するこの記事ご覧externくださいextern

于 2012-07-12T04:42:04.903 に答える
4

実際_static&_staticは、同じ場所を参照しないでください。それらが見える唯一の理由は_static、ポインターに崩壊したコンテキストで使用するためです。つまり、それらの使用方法によって、同じ場所を参照するようにしましたしかし、それを行う前はそうではありませんでした。1 つは配列で、もう 1 つはポインターでした。それらは根本的に異なるものだったので、同じにはなりえませんでした。

于 2012-07-12T04:42:38.263 に答える
0

簡単に言えば、静的はスタックに作成され、動的はヒープに作成されます。静的配列では、プログラムを実行する前にサイズを指定する必要がありますが、動的では、ユーザーから入力を取得してそのサイズの配列を作成できます。

静的例:

int array[5];

動的例:

int *array;
cout << "Enter size of array: ";
cin >> size;
array = new int[size];
于 2012-07-12T08:14:14.980 に答える