【问题标题】:why strsep segment fault为什么strsep段错误
【发布时间】:2012-08-12 12:36:36
【问题描述】:
#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

程序有什么问题?

【问题讨论】:

    标签: strsep


    【解决方案1】:

    如果我不使用 strdup。分配“char *bp = buf”。那么上面 程序会出现段错误。

    它可能需要buf 指向无法合法写入的内存,在这种情况下是字符串文字。如果您使用strdup,您将写入您自己的可写副本。

    【讨论】:

    • char *buf = "2012/9/8";是 const 字符串,如果我将 buf 声明为 :char buf[] = "2012/9/8"。那么它确实有效。
    • 有关为什么字符串文字不是可写内存的信息,我发现this answer 也很有用。
    猜你喜欢
    • 2021-03-26
    • 2020-12-31
    • 2018-06-09
    • 2021-06-08
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多