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导致核心转储[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c中的核心转储和动态内存分配

使用 gdb 检查指针是不是可能在核心转储中有效 [重复]

尝试声明大数组时出现分段错误和核心转储[重复]

分段错误(核心转储)C++,因为我使用了大量内存 [重复]

C++中char指针中的memset的分段错误(核心转储)[重复]

打印分段错误原因[重复]