strtok导致核心转储

时间:2018-05-28 02:14:04

标签: c pointers coredump

我运行此代码并将核心转储...

#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 *。

3 个答案:

答案 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的堆栈上,堆栈上的数据可以被修改。