2012-02-12 8 views
1

でセグメンテーションフォールトを取得私は小さなPROGを書いた:は、小さなCプログラム

1 #include<stdio.h> 
    2 main(){ 
    3   char* str = "string"; 
    4   *str = 'k'; 
    5   printf("string is = %s\n",str); 
    6 } 

このプログラムは、任意のエラーや警告なしでコンパイルが、私はそれを実行すると、それがセグメンテーションフォールトを与えます。私は3行目を次のように書き直しています:char str [] = "string";このプログラムは完璧に動作します。誰でも私に問題があることを教えてもらえますか? 3行目を書くこの2つの異なる方法の違いは何ですか?どんな助けでも大歓迎です。ありがとう。

+0

https://www.securecoding.cert.org/confluence/display/seccode/STR30-C.+Do+not+attempt+to+modify+string+literals –

答えて

2
char * str = "string"; 

は、文字列"string"が格納されているメモリ領域を指すポインタを宣言します。このメモリ領域に書き込むための未定義の動作です。通常はクラッシュします。

代わりに、あなたが使用する必要があります値"string"に初期化され、あなたの関数へのローカル文字列を、宣言し

char str[]="string"; 

。この文字列に使用しているメモリはプロシージャのローカルなので、必要に応じて変更できます。そうでない変更しようとすると

+0

あなたの返信をありがとう。誰も私に "文字列"がこれらの2つのケース(char * str = "string";および... char str [] = "string";)に格納される場所を教えてください。データセグメント、テキストセグメント、その他のセクションのいずれになりますか?さらに、gdbのどこに格納されているかを確認するには? – mezda

7
char* str = "string"; 

これは、読み取り専用メモリに文字列を置きます。次の行で修正しようとすると、未定義の動作(通常は不快な動作)になります。代わりに

char str[] = "string"; 

のように試してください。

+1

常にsegfaultを与えますが、実際には未定義の動作です。時々あなたはセグメンテーションを取得し、他のものは正常に動作します。 – Fingolfin

+1

ちょっとしないでください。 – Duck

+0

実際、私はこれをやっているときに通常バスエラーがありました。 – Eregrith

0
I also executed the given code.. 

    1 #include<stdio.h> 
    2 main(){ 
    3   char* str = "string"; 
    4   *str = 'k'; 
    5   printf("string is = %s\n",str); 
    6 } 

But there is no such error. 

Following output is shown.... 

String is=Ktring 

A segmentation fault, bus error, or access violation is generally an attempt 
to access memory that the CPU cannot physically address. So in my opinion it's 
completely depends on execution. 

thanks... 
関連する問題