3

次のように文字列を宣言する場合:

char *mypointerorarray[] = {"string1", "string2", "string3"};

これは複数の配列へのポインタですか、それとも文字列へのポインタの配列ですか?

また、これをメモリから削除するにはどうすればよいですか?

4

4 に答える 4

4
  1. これはcharsへのポインタの配列です
  2. 動的メモリが割り当てられていないため、これをメモリから削除することはありません。スタックメモリが使用されます。
于 2013-01-08T20:42:20.753 に答える
1

これは、へのポインタの配列ですchar。文字列リテラル、、、およびのアドレスが含まれます。 "string1""string2""string3"

文字列リテラルのメモリは、プログラムの起動時に割り当てられ、プログラムが終了するまで保持されます。

配列が(ファイルスコープで)関数の外部で宣言されている場合、またはキーワードを使用して関数またはブロック内で宣言されている場合、その配列staticのメモリ(3つのポインタ値を保持するのに十分)もプログラムの起動時に割り当てられ、プログラムは終了します。

配列が関数またはブロック内で宣言されている場合、そのメモリは、論理的に言えば、ブロックの開始時に割り当てられ、ブロックの終了時に解放されます。実際には、変数の存続期間が関数全体に及ばない場合でも、関数内のすべての変数のメモリはauto関数のエントリで確保されます。たとえば、与えられたコード

void (foo)
{
  int x;
  int y;
  ...
  for (int i = 0; i < 100; i++)
  {
    int j;
    int k;
    ...
    if (condition())
    {
      char *arr[] = {"string1", "string2", "string3"};
      ...
    ]
    ...
  }
  ...
}

の有効期間arrは内部ifステートメントに制限され、、、の有効i期間はループに制限され、関数全体にわたってのみj有効期間があります。ただし、私が精通しているすべての実装では、関数のエントリ時に、、、、、、およびにメモリを割り当て、関数が終了するまでそれを保持します。 kxyxyijkarr

于 2013-01-08T22:54:28.933 に答える
1
char *mypointerorarray[] = {"string1", "string2", "string3"};

上記の宣言は文字ポインタの配列です。この場合、3つの文字ポインターを取得し、各ポインターは対応する文字列リテラルを指していることを意味します。つまり、char * mypointerorarray [0]-> "string1"、char * mypointerorarray [1]-> "string2"、およびchar * mypointerorarray[2]->"string3"です。

于 2013-01-09T05:49:22.773 に答える
1

mypointerorarray3 つのポインターの配列です。ただし、この配列の要素はたまたま文字列リテラルの先頭を指しています。各文字列リテラルはそれ自体が配列です。

そもそも割り当てていないため、「メモリから削除」することはできません。your が定義されている場所に応じてmypointerorarray、静的または自動の保存期間があります。保存期間が終了すると、自動的に「メモリから削除」されます。

于 2013-01-08T23:13:28.887 に答える