2016-12-02 26 views
0

文字列を格納するメモリを動的に割り当てて、char ***(文字列の2次元配列または3次元文字配列)にする関数があります。ダイナミック2D配列内に文字列リテラルを格納するC

私は後で文字列リテラルとして格納する方が良いと考えていたので、配列をconst char ***に変更しました。しかし、strcpy()free()を使用しているときにエラーが発生しています。

error: passing argument 1 of 'strcpy' discards 'const' qualifier from pointer target type 

私はパラメータstrcpy()free()テイクがタイプchar *void *であることを理解し、私もそれがconst char *代わりのchar *に文字列を格納することをお勧めであることを読んだことがあります。

strcpy()またはfree()のような操作で文字列リテラルを使用できない場合はどうすればよいですか? const char ***の代わりにchar ***としておく必要がありますか?私は理解していないここに何かが明らかです。

+1

'char ***'型のオブジェクトも、それが指すオブジェクトも、文字列の2D配列または 'char'の3D配列ではなく、それら自体が互いに区別されません。より一般的には、配列とポインタは全く同じものではなく、多次元配列は配列の配列であり、ポインタの配列ではありません。 –

答えて

1

あなたの配列には文字列リテラルへのポインタは含まれていませんが、代わりに文字列リテラルのコピーが含まれていると思います。さもなければstrcpyは何のために使われますか?したがって、配列(または対応するポインタ)宣言からconst修飾子を削除することができます。 Cの文字列リテラルには、定数でない配列の型があることを考慮してください。

+0

'strcpy()'を使わず、文字列リテラルを直接代入すればいいのですが 'const char ***'を使いたいとしたら?例えば'const char * a =" foo "; const char * b = a'?そして1つの空文字列リテラル( 'const char *')をしますか? – thestateofmay

+0

@thestateofmay文字列リテラルへのポインタを格納する場合は、修飾子constを使用できます。文字列リテラルは静的な記憶期間を持ちます。 –

+0

@testateofmayは、動的に割り当てられたオブジェクトだけを解放します。文字列リテラルは動的に割り当てられません(Vladの発言では、静的な記憶期間があると伝えられますが、それを認識するかどうかは不明です)。 –

関連する問題