2017-07-11 10 views
0

こんにちは私は以下のプログラムを持っています。char *の値を変更するにはどうすればよいですか?

char *x="abc"; 
*x=48; 
printf("%c",*x); 

これは私に出力aを与えますが、私は0として出力を期待。

EDIT は、私はあなたがstring literalを変更する(しよう)することはできません

char *x; 
+0

新しいアドレスを割り当てます。 *を指しているものを変更するつもりでしたか? – StoryTeller

+3

[* magic numbers *](https://en.wikipedia.org/wiki/Magic_number_(プログラミング))は使用しないでください。あなたが文字 '' 0 ''を意味するならば、* say * so。 –

+0

@StoryTellerはい。私はそれを指しているものを変更したい。 – abhinandanbr

答えて

4

することはできません:試行時の動作は、が定義されていませんです。文字列​​は、読み取り専用リテラルです(形式はconst char[4])。

あなたが書く場合

char x[] = "abc"; 

その後文字列を変更するを許可されています。

+2

'char x [] =" abc ";は正しい構文です。 ;) – mch

+0

これはCで、@ mchは正しい! – haccks

+0

@mch:毎回1ドルあれば間違って書いてしまった;-) – Bathsheba

1

で、実行時にデータを格納するために何ができるかを提案することができます。それはundefined behaviorを引き起こします。

書き込み許可のメモリを使用する必要があります。 2つの方法があります。

  • (すなわち、xにメモリアロケータ方法によって返されたポインタを格納する)xをポインタにメモリを割り当て、これは書き込み可能、​​およびstrcpy()を使用してリテラル文字列をコピーします。

    char * x = NULL; 
        if (x = malloc(DEF_SIZ)) {strcpy(x, "abc");} 
    
    • OR、NOT厳密に標準準拠、より短い、strdup()

      char *x = strdup("abc"); 
      
  • アレイxを使用して、文字列リテラルで初期化。

    上記のすべての場合において
    char x[] = "abc"; 
    

x(またはむしろ、xによって指し示されたメモリ位置)が変更可能です。

+0

これをさらに明確にするために、私の答えの例をあなたのコピーに害はありません。 – Bathsheba

+0

@ Bathshebaそれはあなたの答えにとにかくそこにあるので、私は繰り返さなかったが、それがこれをより良くすると思うなら、とにかく害はない。 –

+0

@mchコピー・ペーストが原因です。 :) –

関連する問題