次のように文字列を宣言する場合:
char *mypointerorarray[] = {"string1", "string2", "string3"};
これは複数の配列へのポインタですか、それとも文字列へのポインタの配列ですか?
また、これをメモリから削除するにはどうすればよいですか?
これは、へのポインタの配列です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
有効期間があります。ただし、私が精通しているすべての実装では、関数のエントリ時に、、、、、、およびにメモリを割り当て、関数が終了するまでそれを保持します。 k
x
y
x
y
i
j
k
arr
char *mypointerorarray[] = {"string1", "string2", "string3"};
上記の宣言は文字ポインタの配列です。この場合、3つの文字ポインターを取得し、各ポインターは対応する文字列リテラルを指していることを意味します。つまり、char * mypointerorarray [0]-> "string1"、char * mypointerorarray [1]-> "string2"、およびchar * mypointerorarray[2]->"string3"です。
mypointerorarray
3 つのポインターの配列です。ただし、この配列の要素はたまたま文字列リテラルの先頭を指しています。各文字列リテラルはそれ自体が配列です。
そもそも割り当てていないため、「メモリから削除」することはできません。your が定義されている場所に応じてmypointerorarray
、静的または自動の保存期間があります。保存期間が終了すると、自動的に「メモリから削除」されます。