

下記の結果で、文字化けをする。

[code]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
    char *in="abc";
    char *out;
    while(*out++ = *in++);
    printf("%s\n",out);
    return 1;
    }
    
[/code]


CC BY-SA 3.0
2017-02-25T03:13:25.987
32934
2017-02-26T01:53:56.530
2017-02-25T03:17:20.320
3605
14909
question
c
C言語のポインターに詰まっています。


2つ問題があります。

  1. 書き込む先のメモリが確保されておらず、`out`が初期化されていませんので、不明の場所に書き込むと，最悪プログラムが異常終了します。
  2. 結果を表示するときの`out`が、文字終端の次を指しているので、そこにどんなデータがあるか予測できませんので、期待した結果が表示されません。

1の問題はメモリを確保してそのアドレスを`out`にセットします。

例：

[code]

    char buf[10];
    out = buf;
    
[/code]

2の問題は、表示する際、メモリの先頭アドレスを`printf`に渡します。

例：

[code]

    printf("%s\n", buf);
    
[/code]


CC BY-SA 3.0
2017-02-25T04:11:21.740
32935
2017-02-25T04:11:21.740
3337
32934
answer


修正方法はsoramimiさんが答えられているので、何が起こっているのかを説明します。

  1. 初期状態
[code]     'a', 'b', 'c', '\0'

     ↑ in "abc"の先頭を指している
    
     ↑ out 未初期化なのでどこを指しているか不定
    
[/code]

  2. `while(*out++ = *in++);`１周目、`a`を書き込んだので`while`ループを継続
[code]     'a', 'b', 'c', '\0'

          ↑ in
    'a'
          ↑ out
    
[/code]

  3. `while(*out++ = *in++);`２周目、`b`を書き込んだので`while`ループを継続
[code]     'a', 'b', 'c', '\0'

               ↑ in
    'a', 'b'
               ↑ out
    
[/code]

  4. `while(*out++ = *in++);`３周目、`c`を書き込んだので`while`ループを継続
[code]     'a', 'b', 'c', '\0'

                    ↑ in
    'a', 'b', 'c'
                    ↑ out
    
[/code]

  5. `while(*out++ = *in++);`４周目、`\0`を書き込んだので`while`ループを終了
[code]     'a', 'b', 'c', '\0'

                        ↑ in
    'a', 'b', 'c', '\0'
                        ↑ out
    
[/code]

この状態で`printf("%s\n",out);`を実行するので、どこを指しているか不明なメモリの、まだ書き込んでない部分を出力する

* * *

というわけで、何が出力されるか全く不定です。当然、 **文字化け** でもなんでもなく単なるプログラムのバグです。


CC BY-SA 3.0
2017-02-26T01:53:56.530
32948
2017-02-26T01:53:56.530
4236
32934
answer