ポインタと配列

ポインタも配列も,変数そのものはアドレスを指し示すという意味では同じだけど,
ポインタは,定義するだけじゃサイズが決まらない.

ポインタとして定義したものには配列のアドレスを代入するとサイズがわかるようになる.的な...


だから,以下のようなものはセグフォになっちゃうけど,

#include <stdio.h>

int main()
{
    char *piyo = "piyo";
    char *piyo_orig;

    printf("Replace i to o\n");
    printf(" original -> %s\n", piyo);

    piyo_orig = piyo;

    ++piyo_orig;           // アドレスを次の文字へ
    *piyo_orig = 'o';      // i を o に変えたつもり

    printf(" replaced -> %s\n", piyo);
    return 0;
}

以下のようなものならいける.

#include <stdio.h>

int main()
{
    char piyo[5] = "piyo";
    char *piyo_orig;

    printf("Replace i to o\n");
    printf(" original -> %s\n", piyo);

    piyo_orig = piyo;

    ++piyo_orig;           // アドレスを次の文字へ
    *piyo_orig = 'o';      // i を o に変えたつもり

    printf(" replaced -> %s\n", piyo);
    return 0;
}


両者の実行結果は以下.

Replace i to o
 original -> piyo
zsh: segmentation fault  ./a.out
Replace i to o
 original -> piyo
 replaced -> poyo