可能重复:
Why do I get a segmentation fault when writing to a string?
我的C代码遇到了一个奇怪的问题。我正在尝试使用strtok函数拆分字符串,但是我得到访问冲突异常。这是我的代码:
char *token;
char *line = "LINE TO BE SEPARATED";
char *search = " ";
token = strtok(line, search); <-- this code causes crash
但是,如果我将char *line
更改为char line[]
,则一切都按预期工作,我不会收到任何错误。
任何人都可以用strtok解释为什么我会这样做(对我来说很奇怪)?我认为char *和char []是相同且确切的类型。
更新
我正在使用MSVC 2012编译器。
答案 0 :(得分:8)
strtok()
修改它解析的字符串。如果您使用:
char* line = "...";
然后正在修改字符串文字,这是未定义的行为。当你使用:
char[] line = "...";
然后正在修改字符串文字的副本。
答案 1 :(得分:5)
将"LINE TO BE SEPARATED"
分配给char *line
时,会使line
指向程序可执行文件中写入的常量字符串。您不能修改它。您应该将这类变量声明为const char *
。
当声明为char[]
时,您的字符串将在您的函数堆栈中声明。因此,您可以修改它。
答案 2 :(得分:3)
char *s = "any string"
是指针的定义,指向字符串或char(s)数组。在上面的示例中,s
指向一个常量字符串
char s[] = "any string"
是char(s)数组的定义。在上面的示例中,s
是一个char(s)数组,其中包含charcters {'a','n','y',' ','s','t','r,'i','n','g','\0'}
strtock
更改输入字符串的内容。它用'\0'
(null)替换字符串中的熟食者。
因此,您不能将strtok
与常量字符串一起使用,如下所示:
char *s="any string"
您可以将strtok与动态内存或静态内存一起使用,如:
char *s = malloc(20 * sizeof(char)); //dynamic allocation for string
strcpy(s,"any string");
char s[20] = "any string"; //static allocation for string
char s[] = "any string"; //static allocation for string
答案 3 :(得分:1)
回答你的问题:char* and char[] are not same type?
此:
char *line = "LINE TO BE SEPARATED";
是在只读内存中定义的字符串文字。你不能改变这个字符串。
但是:
char line[] = "LINE TO BE SEPARATED";
现在是一个放在堆栈上的字符数组(引用的文本被复制到数组中)。您可以修改此数组中的字符。
所以它们都是字符数组,但放在内存的不同部分。