IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

「 *s 」と「 s[] 」の違い

沖林さんがんばれ!

なんか、かわいそうになってきた><がんばってください!
C/C++のポインタの機能--配列との関係 - builder by ZDNet Japan

ところで

僕はちゃんと説明できるかな><
少しでも言葉や概念が変だったら教えてください><

*s
char *s = "hoge";

コードがロードされたときに文字列もメモリにロードされて、実行時にスタックにポインタ変数ができて文字列を指す。
文字列がロードされたメモリのページ(?)には、書き込み権限が付加されないので文字列の内容を書き換えることはできない。

    .cstring
str:
    .ascii "hoge"

    .text
    .globl _main
_main:
    pushl $str

↑イメージ的にはこんな感じ

s[]
char s[] = "hoge";

コードがロードされたときに文字列もメモリにロードされ、実行時にスタックポインタがガバッとずらされて、その文字列がスタック領域にコピーされる。
スタック領域が存在しているページ(?)には、書き込み権限が付加されているので文字列の内容を書き換えることができる。

    .cstring
str:
    .ascii "hoge"

    .text
    .globl _main
_main:
    movl $str, %ebx
    pushl 4(%ebx)
    pushl 3(%ebx)
    pushl 2(%ebx)
    pushl 1(%ebx)
    pushl 0(%ebx)

↑イメージ的にはこんな感じ

うーん

うまく説明できない><