【问题标题】:I don't understand why Im getting a Bad access exception我不明白为什么我得到一个错误的访问异常
【发布时间】:2019-07-30 17:57:23
【问题描述】:

我正在尝试在 C++ 中实现我自己的 str concat 函数,但是我的一个指针变量没有被分配给另一个指针值。当我在 CLION 中调试我的程序时,它会将我带到*p = *s2 行,并将我的*p 变量分配给\0 而不是b。我不确定这个错误是从哪里来的,我能否获得有关如何在 cLion 中进一步调试的帮助?

我尝试将参数中的第二个字符指针更改为 const,并在谷歌上搜索EXC_BAD_ACCESS (code=2, address=0x10c226edd) 的答案。

 char * my_strcat(char* s1, char* s2)
{
    if(s1 == NULL || s2 == NULL) {
        return NULL;
    }
    char *p = s1;
    while (*p != '\0')
    {
        p++;
    }

    while (*s2 != '\0')
    {
        *p = *s2;
        p++;
        s2++;
    }
    *p = '\0';

    return s1;
}


  char *arr4 = "Taco";
  char *arr5 = "bean";
  std::cout << my_strcat(arr4,arr5) << std::endl;

预期的结果是arr4arr5 要连接,实际结果不会打印。

【问题讨论】:

  • char *arr4 = "Taco"; 在现代c++ 中应该是一个错误,这需要是const char *arr4 = "Taco";
  • char *arr4 = "Taco"; char *arr5 = "bean"; -- 您不能连接到字符串文字。其次,即使这些不是字符串文字,"bean" 连接到"Taco" 的空间在哪里? C++ 不会为你腾出空间——你必须确保空间在那里。
  • 对于s1,您需要一个realloc
  • @OP -- 具有讽刺意味的是,如果您真的试图模仿 strcat 所做的事情,那么您得到的错误应该会发生。 strcat 函数不检查是否有空格,如果您可以绕过 C++ 的类型安全,strcat 将不关心传递的内容是否是字符串文字。您的代码唯一要做的就是检查NULL,而strcat 没有这样做。你的程序会用strcat 在你身上爆炸,就像现在一样。所以实际上,你的实现(行为)比你想象的更接近strcat的标准版本。

标签: c++


【解决方案1】:

问题在于字符串文字不可修改。 C 字符串也不会自动增长以适应添加到它们的字符。试试这个吧。

char arr4[100] = "Taco";

现在arr4 确实是一个数组,它有足够的空间让您在字符串中再添加 95 个字符。

我认为你需要修改指针和数组之间的区别,这是一个很容易让新手感到困惑的话题。

【讨论】:

    【解决方案2】:

    暂时忽略you are invoking undefined behavior in your code by trying to modify a string literal 的事实,您还有另一个问题。即使char* 部分确实按预期工作,您仍在尝试写入未分配的数据。

    原因是p = s1。这意味着p 在该地址分配的数据量与s1 相同。为什么这很重要?好吧,当你尝试这样做时:

    while (*s2 != '\0')
    {
       *p = *s2;
       p++;
       s2++;
    }
    

    您将进入一个未分配的空间,因为p 现在指向一个过去s1 已分配的位置。 That's also undefined behavior,可能会导致崩溃。

    您确实需要修复这两个错误。让您的程序正常运行。

    我的建议是改用std::string

    std::string s1 = "Taco";
    std::string s2 = "bean";
    
    std::cout << s1+s2 << std::endl;
    

    简单多了!

    顺便说一句,我推荐reading this question,特别是this answer to that question(如果您想连接两个字符数组)以获取有关您尝试做什么的更多信息。

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多