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

int main() {
  char *buf = "2012/9/8";
  char sep[] = "/";
  char *token;
//  char *bp = strdup(buf);
  char *bp = buf;
  while ((token = strsep(&bp,sep))) {
    printf("tok = `%s'\n", token);
  }
  free(bp);
  return 0;
}

strdupを使用しない場合。「char *bp = buf」を割り当てます。次に、上記のプログラムは障害をセグメント化します。以下の gdb 出力:

Program terminated with signal 11, Segmentation fault.
#0  0x00007fcc949c13b5 in strsep () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0  0x00007fcc949c13b5 in strsep () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00000000004005d5 in main () at str_split.c:11

プログラムの何が問題になっていますか?

4

1 に答える 1

4

strdupを使用しない場合。「char *bp = buf」を割り当てます。次に、上記のプログラムは障害をセグメント化します。

buf合法的に書き込むことができないメモリ、この場合は文字列リテラルを指す必要があるかもしれません。を使用strdupすると、自分の書き込み可能なコピーに書き込むことになります。

于 2012-08-12T12:39:00.167 に答える