C 文字列の分割(strtok) GDBで観察

"12 34 56"というスペースで区切られた文字列を "12", "34", "56" に分割するプログラム
strtokを繰り返し実行することで、順番に"12", "34", "56"を取得できる。

1回目のstrtokの実行で、
strは"12 34 56"から"12\034 56"に変更される(1番目のスペースが\0に置き換わる)。
そして、strtokは、文字列"12\0"の先頭のポインタを返す。

2回目のstrtokの実行で、
strは"12\034 56"から"12\034\056"に変更される(2番目のスペースが\0に置き換わる)。
そして、strtokは、文字列"34\0"の先頭のポインタを返す。

3回目のstrtokの実行で、
strは変更されない。
そして、strtokは、文字列"56\0"の先頭のポインタを返す。

#include <stdio.h>
#include <string.h>

int main(void) {
  char str[] = "12 34 56";
  char *tp;

  tp = strtok(str, " ");
  puts(tp);
  while (tp != NULL) {
    tp = strtok(NULL, " ");
    if (tp != NULL) puts(tp);
  }

  return 0;
}
(gdb) break main
Breakpoint 1 at 0x114d: file strtok_sample.c, line 5.
(gdb) run
Breakpoint 1, main () at strtok_sample.c:5
5         char str[] = "12 34 56";
(gdb) next
8         tp = strtok(str, " ");
(gdb) x/s str
0x7fffffffdedf: "12 34 56"
(gdb) x/9xb str
0x7fffffffdedf: 0x31    0x32    0x20    0x33    0x34    0x20    0x35    0x36
0x7fffffffdee7: 0x00
(gdb) next
9         puts(tp);
(gdb) x/s str
0x7fffffffdedf: "12"
(gdb) x/9xb str
0x7fffffffdedf: 0x31    0x32    0x00    0x33    0x34    0x20    0x35    0x36
0x7fffffffdee7: 0x00
(gdb) x/s tp
0x7fffffffdedf: "12"
(gdb) x/9xb tp
0x7fffffffdedf: 0x31    0x32    0x00    0x33    0x34    0x20    0x35    0x36
0x7fffffffdee7: 0x00
(gdb) next
12
10        while (tp != NULL) {
(gdb) next
11          tp = strtok(NULL, " ");
(gdb) next
12          if (tp != NULL) puts(tp);
(gdb) x/s str
0x7fffffffdedf: "12"
(gdb) x/9xb str
0x7fffffffdedf: 0x31    0x32    0x00    0x33    0x34    0x00    0x35    0x36
0x7fffffffdee7: 0x00
(gdb) x/s tp
0x7fffffffdee2: "34"
(gdb) x/9xb tp
0x7fffffffdee2: 0x33    0x34    0x00    0x35    0x36    0x00    0xe2    0xde
0x7fffffffdeea: 0xff
(gdb) next
34
10        while (tp != NULL) {
(gdb) next
11          tp = strtok(NULL, " ");
(gdb) next
12          if (tp != NULL) puts(tp);
(gdb) x/s str
0x7fffffffdedf: "12"
(gdb) x/9xb str
0x7fffffffdedf: 0x31    0x32    0x00    0x33    0x34    0x00    0x35    0x36
0x7fffffffdee7: 0x00
(gdb) x/s tp
0x7fffffffdee5: "56"
(gdb) x/9xb tp
0x7fffffffdee5: 0x35    0x36    0x00    0xe5    0xde    0xff    0xff    0xff
0x7fffffffdeed: 0x7f
(gdb) next
56
10        while (tp != NULL) {
(gdb) next
11          tp = strtok(NULL, " ");
(gdb) next
12          if (tp != NULL) puts(tp);
(gdb) print tp
$1 = 0x0
(gdb) x/9xb str
0x7fffffffdedf: 0x31    0x32    0x00    0x33    0x34    0x00    0x35    0x36
0x7fffffffdee7: 0x00
(gdb) next
10        while (tp != NULL) {
(gdb) next
15        return 0;