4

可能重复:
为什么在写入字符串时会出现分段错误?

我的 C 代码遇到了一个奇怪的问题。我正在尝试使用 strtok 函数拆分字符串,但出现访问冲突异常。这是我的代码:

char *token;
char *line = "LINE TO BE SEPARATED";
char *search = " ";
token = strtok(line, search); <-- this code causes crash

但是,如果我更改char *linechar line[],一切都会按预期进行,并且不会出现任何错误。

任何人都可以解释为什么我会用 strtok 得到这种(对我来说很奇怪)行为?我认为 char* 和 char[] 是相同且精确的类型。

更新

我正在使用 MSVC 2012 编译器。

4

4 回答 4

8

strtok()修改它解析的字符串。如果您使用:

char* line = "...";

然后正在修改字符串文字,这是未定义的行为。当您使用:

char[] line = "...";

然后正在修改字符串文字的副本。

于 2012-11-28T14:19:51.267 回答
5

分配"LINE TO BE SEPARATED"给 时char *line,您line指向写入程序可执行文件中的常量字符串。您无权对其进行修改。您应该将这类变量声明为const char *.

当声明为 时char[],您的字符串将在函数的堆栈上声明。因此,您可以对其进行修改。

于 2012-11-28T14:20:06.133 回答
3
char *s = "any string"

是指向字符串或字符数组的指针的定义。在上面的例子s中是指向一个常量字符串

char s[] = "any string"

是 char(s) 数组的定义。在上面的例子s中是一个包含字符的字符数组{'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
于 2012-11-28T14:20:17.610 回答
1

要回答您的问题:char* and char[] are not same type?

这个:

char *line = "LINE TO BE SEPARATED";

是在只读内存中定义的字符串文字。您无法更改此字符串。

然而,这:

char line[] = "LINE TO BE SEPARATED";

现在是放置在堆栈上的字符数组(引用的文本被复制到数组中)。您可以修改此数组中的字符。

所以它们都是字符数组,但是放在内存的不同部分。

于 2012-11-28T14:25:30.523 回答