【问题标题】:strtok cause core dump [duplicate]strtok导致核心转储[重复]
【发布时间】: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*。

【问题讨论】:

    标签: c pointers coredump


    【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-23
          相关资源
          最近更新 更多