2016-11-15 11 views
1

実行時にエラーが発生する理由を知りたいのですが。ポインタで指された文字の値を変更する

ポインタ変数が指す文字の値を変更しようとしています。

#include <stdio.h> 

int main() { 
    char amessage[] = "foo"; 
    char *pmessage = "foo"; 

    // try 1 
    amessage[0] = 'o'; // change the first character to '0' 
    printf("%s\n", amessage); 

    // try 2 
    *pmessage = 'o'; // This one does not work 
    printf("%s\n", pmessage); 
} 

最初の試行では、oooが表示されます。しかし、2番目の私は与えます:

[1] 9677 bus error ./a.out 

アイデア?このステートメントで

+0

配列とポインタはCで同じものではありません –

+0

ありがとう@GovindParmar。 Downvoters:私はこの質問を改善する方法を説明してください。 –

答えて

4

*pmessage = 'o'; 

リテラル"foo"文字列を変更しようとしているポインタが

char *pmessage = "foo"; 

のように定義されているので、文字列リテラルは、CやC++で不変です。文字列リテラルを変更しようとすると、未定義の動作になります。 C標準(6.4.5文字列リテラル)から

7は、それら 要素が適切な値を持って設けられ、これらの配列が異なっているかどうかを指定されていません。 プログラムが にそのような配列を変更しようとすると、動作は未定義です。

+0

Vladに感謝します。あなたの答えによれば、このコード行は現在のC標準では有効ではないことを確認できますか? https://github.com/ccpalettes/the-c-programming-language-second-edition-solutions/blob/master/Chapter5/Exercise%205-05/strncpy.c#L25 –

+0

@SungWonChoサンプルの行はあなたです文字列リテラル自体がそこで変更されていないため、参照は正しいです。 –

+0

@SungWonCho別の問題があります。文字列リテラルがコピーされたメモリは割り当てられませんでした。したがって、コードには未定義の動作があります。ポインタsはchar * sのように宣言されています。不確定な値を持つ。 –

関連する問題