char *和char []是不是同一类型?

时间:2012-11-28 14:17:46

标签: c

  

可能重复:
  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编译器。

4 个答案:

答案 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";

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

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