2011-05-23 6 views
2
char* pstr[] = { "Robert Redford", // Initializing a pointer array 
       "Hopalong Cassidy", 
       "Lassie", 
       "Slim Pickens", 
       "Boris Karloff", 
       "Oliver Hardy" 
       }; 

私は以下のように記述する場合:C++ポインタの説明

*pstr[0] = 'X'; 

この文が実行されたときプログラムはコンパイルが、クラッシュすることができます。どうして?私は* pstr [0]が 'R'であるので、 'R'から 'X'に変更できると思った。 ありがとう!

答えて

7

コンパイラはあなたに警告しておく必要があります。

多くのように、変更可能なchar型のポインタにいくつかの一定のchar配列を割り当てているあなたがここでやっている
warning: deprecated conversion from string constant to 'char*'' 

:結果は

const char[] astring = "ababa"; 
char* mutablestring = astring; // shouldn't be possible 
mutablestring[0] = 'o'; // change 'readonly' location 

、実行時に、あなたのバイナリを指すポインタと書き込み先のポインタ。しかし、それは読み込み専用メモリなので、クラッシュします。

+2

C++ 11以降、コンパイラは変換をエラーとして扱います。 –

7

const char*の配列へのポインタを作成しています。したがって、pstr [0]はconst char*を指しており、値を変更することはできません。

それはあなたが値の代わりに、ランタイムエラーを変更しようとする場合は、コンパイラエラーが発生しますので、このようにこのコードを書くための良いプログラミングの練習です:

char* const pstr[] = { "Robert Redford", // Initializing a pointer array 
       "Hopalong Cassidy", 
       "Lassie", 
       "Slim Pickens", 
       "Boris Karloff", 
       "Oliver Hardy" 
       }; 
+0

+1のように宣言することができます。あなたの作業を楽にするために 'std :: string'を使うこともできます。 – ereOn

+0

と良いアドバイスのために+1: 'const'ルール! – xtofl

+1

文字列リテラルは歴史的な理由から正式に 'char *'型であるため、コンパイルされていますが実際は不変です。 –

2

文字列リテラルは定数であるので、あなたはそれらを変更することはできません。

const char*からchar*への変換では、Cがconstになる前の時刻から古いCコードを許可することができます。

2

pstrは、const *char要素の配列です。読み取り専用メモリの変更結果は未定義です。各文字列の最大サイズを知っている場合はpstrのように

char pstr[][32] = { "Robert Redford", 
       "Hopalong Cassidy", 
       "Lassie", 
       "Slim Pickens", 
       "Boris Karloff", 
       "Oliver Hardy" 
       };