【发布时间】: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;
预期的结果是arr4 和arr5 要连接,实际结果不会打印。
【问题讨论】:
-
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++