strtok - char数组与char指针

Der*_*k H 10 c arrays pointers strtok

可能重复:
strtok不接受:char*str

使用该strtok功能时,使用char *而不是char []导致分段错误.

这运行正常:

char string[] = "hello world";
char *result = strtok(string, " ");
Run Code Online (Sandbox Code Playgroud)

这会导致分段错误:

char *string = "hello world";
char *result = strtok(string, " ");
Run Code Online (Sandbox Code Playgroud)

任何人都能解释导致这种行为差异的原因吗?

asc*_*ler 28

char string[] = "hello world";
Run Code Online (Sandbox Code Playgroud)

该行初始化string为足够大的字符数组(在本例中char[12]).它将这些字符复制到您的本地数组中,就像您已经写出来一样

char string[] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0' };
Run Code Online (Sandbox Code Playgroud)

另一行:

char* string = "hello world";
Run Code Online (Sandbox Code Playgroud)

不初始化本地数组,它只是初始化一个本地指针.允许编译器将其设置为指向不允许更改的数组的指针,就像代码一样

const char literal_string[] = "hello world";
char* string = (char*) literal_string;
Run Code Online (Sandbox Code Playgroud)

C允许这个没有演员的原因主要是让古代代码继续编译.您应该假装源代码中的字符串文字的类型const char[],可以转换为const char*,但永远不会将其转换为char*.

  • 很多很好的答案,但我发现这是基本问题的最清晰的例子。 (2认同)

Mic*_*urr 14

在第二个例子中:

char *string = "hello world";
char *result = strtok(string, " ");
Run Code Online (Sandbox Code Playgroud)

指针string指向一个字符串文字,不能修改(strtok()想做).

你可以做一些事情:

char *string = strdup("hello world");
char *result = strtok(string, " ");
Run Code Online (Sandbox Code Playgroud)

所以它string指向一个可修改的文字副本.