2012-08-12 62 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