2010-11-20 44 views
8
int main() 
{ 
     char *temp = "Paras"; 

     int i; 
     i=0; 

     temp[3]='F'; 

     for (i =0 ; i < 5 ; i++) 
       printf("%c\n", temp[i]); 

     return 0; 
} 

なぜtemp[3]='F';tempがセグメンテーションフォールトを引き起こすのですかconstですか?次の理由でセグメント違反が発生するのはなぜですか?

+3

あなたの鼻に悪魔の力を与えるのではなく、定義されていない動作を呼び出すときに、あなたのC/OSの実装が豊富で即座にプログラムを終了させるためです。 –

答えて

9

文字列リテラルを変更することはできません。

+0

しかし、 'temp'は' const'ではありません – cse

+0

うん。コンパイラはそれについて警告しなければならないと思いますが、gccはそうではありません。どちらの方法でも、コンパイラは文字列定数を読み込み専用メモリに入れることができます。 –

+0

なぜ、 'char temp [6] =" Paras ";が動作するのですか? – cse

0

* tempは定数へのポインタとして定義されます(文字列リテラルとも呼ばれます - 特に他の言語では特にそうです)。

したがって、エラーのある行は、この定数の3番目の文字を変更しようとしています。

char配列を定義し、strcpyを使ってtempをコピーしてみてください。その後、配列上の上記のコードを行う、それは動作するはずです。 (申し訳ありませんが私のipadはSOのインターフェースにコードを挿入するのが好きではありません)

+2

私はその気持ちを知っています。私は、SO開発者が将来のためにiPadユーザーを検討すべきだと思う。 –

0

ご覧のとおり、tempは、値がParasの名前のない配列があるランダムなアドレスを指すポインターです。その配列は文字列定数です。あなたのプログラムが動作するために

は、あなたの代わりに、ポインタの配列を使用する必要があります。それはtemp[6]代わりのtemp[5]だなぜあなたは迷っているならば今

char temp[6] = "Paras"; 

を、上記のコードは、文字列を初期化し、完全に

char temp[5] = {'P', 'a', 'r', 'a', 's'}; 

文字列はヌルターミネータで終了します\0。そして、文字列の初期化は次のようになります:この行はcorrect.The「TEMP」ではありません

char temp[6] = {'P', 'a', 'r', 'a', 's', '\0'}; 
+4

さらに、 'char temp [] ='という方が良いので、コンパイラはその長さを把握しています。 –

0
temp[3]='F'; 

constの値であり、だから、それを変更することはできません。

関連する問題