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*
.
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
指向一个可修改的文字副本.