スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Cのダブルポインターについて何か語っているのをまとめたようだけど、もう昔のものすぎてそのまま記事に投稿しておこうと思った。


-------------------------------------------------------------------
aiya_000 : /*** Warning ***/
// デバッグ中についったーはやめましょう。 [[ 19:13]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : いた。
http://t.co/wWY4OOebDh [[ 19:46]]
-------------------------------------------------------------------
aiya_000 : こういうことか。
http://t.co/HuNRlQEiiq [[ 19:52]]
-------------------------------------------------------------------
aiya_000 : 結果。
http://t.co/eRZx09Tl0A [[ 19:52]]
-------------------------------------------------------------------
aiya_000 : ああ、ダブルポインタな。
http://t.co/nJZQzHr0Mn [[ 19:56]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : …なんで?
char* str;

void func(char* str){ str = "aaa"; }
に渡したらなぜおかしくなる?
func(str);
printf("%s\n", str); // おかしい。 [[ 19:58]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : あー、メモリ確保してないじゃん。
…それでおかしくなるの…? [[ 19:59]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : えー、確かにchar*に何かを装填したいならchar*ポインタ(char**)を渡すのが当然だけど、
なにか腑に落ちない。 [[ 20:02]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : std::stringの場合(戻り値で戻せとかは考えないで)、
void func(std::string* str){ *str = "aaa"; }
std::string str; func(&str);
が普通だけどさ…うーん? [[ 20:03]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : char* str;で
メモリ領域xにstrをsizeof(char*)分確保する。 [[ 20:04]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : func(str);

メモリ領域xを…あーっ!!! [[ 20:05]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : ないじゃん。
メモリ領域xの参照先アドレスないじゃん。
結果的にfunc関数には壊れた参照先アドレスbが渡るじゃん。
あーーーっ!!わほーーいっ!!! [[ 20:06]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : void func(char**);
だと [[ 20:07]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : char* str;でsizeof(char*)を確保、
func(&str);でアドレスxをchar**に渡す。 [[ 20:07]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : で、間接アクセス演算子にて
str(char*)に参照先アドレスを格納する。
例えば
void func(char** str){ *str = "aaa"; }
char* str; func(&str);
ならデータ層のアドレスa("aaa"の先頭アドレス)が格納される。 [[ 20:09]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : あーうっ。 [[ 20:09]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : C++って型安全だねっ!?
多分char** str;とchar* str[X];を違う型だと判断してる。 [[ 20:12]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : そして襲い来るセグメント違反!!
楽しい!!! [[ 20:13]]
---------------------------------------------------------------------------------------------------------------------------------------------
aiya_000 : やっほーいできたあっ!!!
const unsigned char*からconst char*へのキャストっ!!
さすが再解釈キャストだっ!!
http://t.co/mDyM19E89k [[ 20:52]]
---------------------------------------------------------------------------------------------------------------------------------------------
スポンサーサイト

コメント

非公開コメント
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。