2012-08-12 60 views
1
#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输出如下:为什么strsep段的错误

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 

程序出了什么问题?

回答

3

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

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

+1

char * buf =“2012/9/8”;是常量字符串,如果我declar buf为:char buf [] =“2012/9/8”。然后它确实工作。 – youhong 2012-08-13 01:41:04