strtok导致核心转储[重复]
Posted
技术标签:
【中文标题】strtok导致核心转储[重复]【英文标题】:strtok cause core dump [duplicate] 【发布时间】:2018-05-28 02:14:03 【问题描述】:我运行这段代码并转储了核心......
#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"
之后,它就可以工作了。
为什么?
我知道一个是数组,另一个是指针。但是它们对于 strtok 有什么不同吗? strtok 的手册页说第一个参数应该是 char*。
【问题讨论】:
【参考方案1】:从man page
开始,strtok
修改了它的第一个元素。
当您使用文字字符串初始化 char*
时,您将指向分配该文字的只读内存。
当您使用文字字符串初始化 char[]
时,它会获得自己的私有内存,这是可写的。
因此,您在第一个而不是第二个上进行核心转储。
【讨论】:
【参考方案2】:手动if函数char * strtok ( char * str, const char * delimiters );
:
str
要截断的 C 字符串。
请注意,此字符串已被修改,被分解为更小的字符串(令牌)。
或者,可以指定一个空指针,在这种情况下,函数会继续扫描之前成功调用函数的位置。
它尝试修改位于只读内存中的常量字符串文字char *b= "ls -l";
,并转储程序核心。修改变量声明为char b[]= "ls -l";
时,字符串位于main
的栈上,栈上的数据可以修改。
【讨论】:
【参考方案3】:strtok
修改输入字符串。它用空字节覆盖分隔符的实例,以便将字符串拆分为每个标记的以空字符结尾的字符串。字符串文字被编译到程序中,通常驻留在内存的只读段中。因此,它们无法修改,尝试这样做会导致崩溃。
您可以修改您的代码以将字符串存储在堆栈中:
char b[] = "ls -l";
或者创建一个字符串的临时副本:
char *str = strdup(b);
free(str);
【讨论】:
以上是关于strtok导致核心转储[重复]的主要内容,如果未能解决你的问题,请参考以下文章