我运行此代码并将核心转储...
#include <string.h>
#include <stdio.h>
int main()
{
char *a= "ls";
char *b= "ls -l";
char *t = strtok(b," \t");
if (!strcmp(a,t))
printf("EQU\n");
else
printf("NOT EQU\n");
}
但是,在我将char *b="ls -l";
更改为char b[]="ls -l"
之后,它就可以了。
为什么?
我知道One是一个数组,另一个是指针。但他们与strtok不同吗? strtok的手册页说第一个参数应该是char *。
答案 0 :(得分:1)
从man page
开始,local_port
修改其第一个元素。
使用文字字符串初始化EasyAccept()
时,您将指向分配了文字的只读内存。
使用文字字符串初始化strtok
时,它会获得自己的私有内存,这是可写的。
因此,您将核心转储到第一个而不是第二个。
答案 1 :(得分:1)
strtok
修改输入字符串。它使用空字节覆盖分隔符字符的实例,以便将字符串拆分为每个标记的以空字符结尾的字符串。字符串文字被编译到程序中,通常驻留在只读的内存段中。因此,它们无法修改,尝试这样做会导致崩溃。
您可以修改代码,将字符串存储在堆栈中:
char b[] = "ls -l";
或者创建字符串的临时副本:
char *str = strdup(b);
free(str);
答案 2 :(得分:1)
手册char * strtok ( char * str, const char * delimiters );
:
str
要截断的C字符串。
请注意此字符串已修改,方法是将其分解为较小的字符串(标记)。
可选地,可以指定空指针,在这种情况下,该函数继续扫描先前成功调用该函数的位置。
它尝试修改位于只读内存中的const字符串文字char *b= "ls -l";
,并转储程序核心。当您将变量声明修改为char b[]= "ls -l";
时,该字符串位于main
的堆栈上,堆栈上的数据可以被修改。