雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
- ソース を表示
- golibcのバグでお勉強 へ行く。
| 現: 2024-01-06 (土) 22:39:12 hideyosi |
|||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | *strncat関数がおかしいぞ!? [#d2db4884] | ||
| + | [[本家の板>http://osask.net/v/index.php?topic_id=16#post_id186]]にて、うっちゃんが発見した挙動不審部。 | ||
| + | 以下がそのソース。 | ||
| + | char* strncat (char *d, const char *s, size_t sz) | ||
| + | { | ||
| + | char *tmp = d; | ||
| + | |||
| + | while ('\0' != *d) | ||
| + | d++; | ||
| + | |||
| + | while ('\0' != *s) { | ||
| + | if (0 == sz) | ||
| + | break; | ||
| + | sz--; | ||
| + | *d++ = *s++; | ||
| + | } | ||
| + | |||
| + | if (sz) | ||
| + | *d = '\0'; | ||
| + | |||
| + | return tmp; | ||
| + | } | ||
| + | |||
| + | *アドバイスの検証 [#e421d285] | ||
| + | はいそうです! アホなんで書かないとわかんないんです〜 orz | ||
| + | |||
| + | ''なぜこうなるのか?''について、うっちゃんが丁寧に教えてくれたのだ♪ | ||
| + | http://osask.net/v/index.php?topic_id=16#post_id239 | ||
| + | |||
| + | while ('\0' != *d) | ||
| + | d++; | ||
| + | これはなにをやってるのか。文字列sのオケツにポインタを進めていると。(仮に文字列の途中に0x00があれば、そこをオケツとするわけ。 | ||
| + | |||
| + | char str[4] = { 'a', '\0', 'H', '\0' }; | ||
| + | |||
| + | |>|>|>|文字列str| | ||
| + | |0|1|2|3| | ||
| + | |'a'|0x00|'H'|0x00| | ||
| + | |↑| | | | | ||
| + | |||
| + | 上記のwhileによってこういう状態になって、次の処理に移る・・・ | ||
| + | |||
| + | |||
| + | |>|>|>|文字列str| | ||
| + | |0|1|2|3| | ||
| + | |'a'|0x00|'H'|0x00| | ||
| + | | |↑ | | | | ||
| + | |||
| + | |||
| + | while ('\0' != *s) { | ||
| + | if (0 == sz) | ||
| + | break; | ||
| + | sz--; | ||
| + | *d++ = *s++; | ||
| + | } | ||
| + | |||
| + | 文字列sはこうなっている。 | ||
| + | |||
| + | |>|>|>|文字列s| | ||
| + | |0|1|2|3| | ||
| + | |'b'|'b'|'b'|0x00| | ||
| + | |↑ | | | | | ||
| + | |||
| + | szが1なので、whileループは一回だけ処理される | ||
| + | |||
| + | //szは1 | ||
| + | |||
| + | while ('\0' != *s) { | ||
| + | ↑ if (0 == sz) | ||
| + | │ break; | ||
| + | │ sz--; | ||
| + | │ *d++ = *s++; | ||
| + | │ } | ||
| + | │ | ||
| + | │ //szは0 | ||
| + | │ //よーし!ループするぞ! | ||
| + | └────────┘ | ||
| + | |||
| + | |||
| + | |||
| + | //szは0 | ||
| + | ┌──┐ while ('\0' != *s) { | ||
| + | │ │ if (0 == sz) | ||
| + | │ │ break; | ||
| + | │ │ sz--; | ||
| + | │ │ *d++ = *s++; | ||
| + | │ │ } | ||
| + | │ │ | ||
| + | │ │ //szは0 | ||
| + | │ │ //よーし!ループするぞ! | ||
| + | │ └────────┘ | ||
| + | └──────────┐ | ||
| + | ↓ | ||
| + | //なんだSZはもうゼロじゃん。なにもせんで次へ・・・ | ||
- golibcのバグでお勉強 のバックアップ差分(No. All)
- 現: 2024-01-06 (土) 22:39:12 hideyosi