我不明白为什么我收到错误的访问异常

时间:2019-07-30 17:57:23

标签: c++

我正在尝试在C ++中实现自己的str concat函数,但是没有将我的指针变量之一分配给另一个指针值。当我在CLION中调试程序时,它将带我到行*p = *s2,并将*p变量分配给\0而不是b。我不确定此错误来自何处,还可以在cLion中进一步调试该方法获得帮助吗?

我尝试将参数中的第二个char指针更改为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的连接,实际结果没有打印。

2 个答案:

答案 0 :(得分:1)

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

char arr4[100] = "Taco";

现在arr4实际上是一个数组,它有足够的空间供您向字符串中添加95个以上的字符。

我认为您需要修改指针与数组之间的区别,这是新手感到困惑的一个非常常见的话题。

答案 1 :(得分:0)

忽略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(如果您打算串联2个字符数组)以获取有关您要执行的操作的更多信息。