分段故障 C++ 最有可能在 strtok 操作中

Segmentation Fault in C++ most probably in strtok operation

本文关键字:strtok 操作 有可能 故障 C++ 分段      更新时间:2023-10-16

我正在编写一个可以处理多个数字的后缀评估程序。因此,我首先读取字符数组的输入,并将它们拆分为(字符数组)数组。每当我运行我的程序时,它都会给出一个分段错误(Ubuntu 13.10 上的 g++)

这是我拆分的函数

int split(char str[], char *ret[]){
    int c=0;
    char * pch;
    pch = strtok (str," ");
    while (pch != NULL)
    {
        //printf ("%sn",pch);
        strcpy(ret[c], pch); c++;
        //cout<<ret[c];
        pch = strtok (NULL, " ");
    }
    return c;
}

也是我main()的一部分

char* s;
s =  new char[200];
cout<<"Enter Postfix Expression:n > ";
cin.getline(s,200);
char* st[200];
//int size=3;
int size = split(s, st); // < Is what I'm passing correct?

我不明白为什么会发生段错误。有什么建议吗?

编辑:感谢yugnum的回答。以下做了诀窍

...
ret[c] = new char[strlen(pch)];
strcpy(ret[c], pch); c++;
...
char* st[200];
int size = split(s, st);
int split(char str[], char *ret[]){
  ...
  strcpy(ret[c], pch);
  ...
}

这就是问题所在,您只需将一堆未初始化的指针传递给 strcpy,而它需要指向有效分配内存的指针。

你需要st定义为 2D 数组,所以 split 函数将返回一个拆分字符串数组

例如:

char st[20][200]

然后:

int split(char str[], char *ret[][]){

因此,您将拥有 20 个 200 字节字符数组。但这根本不安全,我建议您考虑其他类似vectorstd::string.此外,您还需要在strcpy之前分配数组。

然后

strcpy(ret[c], pch); 

以 C 作为计数器,将拆分的新字符串复制到您的 char 数组中。但是考虑一下 std::string,这是最好的选择