【问题标题】:c++ split function randomly crashingc++ split函数随机崩溃
【发布时间】:2014-04-23 14:53:24
【问题描述】:

我为 c++ 编写了一个函数拆分,因为我在我的程序中需要它,但它会随机使程序崩溃。如果我不断重新启动相同的示例程序,它有时会工作,有时会崩溃。

函数如下:

char ** split(char * string, char delimiter, int &num_substrings)
{
num_substrings = 0;

char ** substrings = NULL;
int temp_len = 0;
int string_pos = 0;


substrings = (char **) calloc(1, sizeof(char*));
substrings[num_substrings] = (char *) calloc(1, sizeof(char));

while(string[string_pos] != '\0')
{
    if(string[string_pos] == delimiter)
    {
        num_substrings++;
        substrings = (char **) realloc(substrings, (num_substrings + 1) * sizeof(char*));
        substrings[num_substrings] = (char *) calloc(1, sizeof(char));
        temp_len = 0;
    }else{
        substrings[num_substrings] = (char *) realloc(substrings[num_substrings], (temp_len + 1) * sizeof(char));

        substrings[num_substrings][temp_len] = string[string_pos];
        temp_len++;
        substrings[num_substrings][temp_len] = '\0';
    }
    string_pos++;
}


return substrings;

}

这是我测试它的方法(主要功能):

int main()
{
char *s = "1|3|teststring|";
char ** args = NULL;
int num = 0;

args = split(s, '|', num);
cout<<num<<"\n";
cout<<args[0];

}

我用代码块编译它,但是用 microsoft visual studio 是一样的结果。

【问题讨论】:

  • 除非是为了家庭作业,否则您绝对应该切换到std::stringstd::vector。有可能你甚至不需要问这个问题:)。
  • 这比 C++ 更像 C...使用 std::vector 而不是重新发明轮子怎么样?
  • 我不想要 std::vector,因为在我的程序中我会得到这些子字符串,然后重新分析它们以查看它们是否是数字,然后将它们传递给函数等等。 . 以我想要的方式工作对我来说更容易
  • 1.请先使用调试器来单步调试您的代码。 2. '但它会随机崩溃'我几乎可以肯定这不是随机,而是取决于实际输入。
  • @user3565078 '这对我来说工作更容易......'这简直难以置信。

标签: c++ function crash


【解决方案1】:

要按原样回答函数的问题,temp_len+1 不够大,因为您在此代码中增加了 temp_len

      substrings[num_substrings] = (char *) realloc(substrings[num_substrings],
           (temp_len + 1) * sizeof(char)); // Allocation here
      // ...
      temp_len++;
      substrings[num_substrings][temp_len] = '\0'; // Invalid write 1 byte after

但我同意使用std::stringstd::vector

【讨论】:

  • 假设您不能被说服使用 C++ 字符串,而不是 C 字符串:如果您可以访问 Linux 机器,我建议您通过 valgrind 找到这些问题。这就是我找到这个问题的方式。
猜你喜欢
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 2013-08-23
  • 2013-04-21
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多