我有两个字符串,str1和str2。我希望它们在堆中的空间上连接。我使用malloc空间:
char *concat = (char*) malloc(strlen(str1) + strlen(str2) + 1);
我可以这样做:
strcat(concat, str1);
strcat(concat, str2);
concat会在堆上找到两个字符串的位置吗?我问,因为看起来strcat实际上会将str1添加到使用malloc分配的空间的末尾。它是否正确?那么,str1将出现在strlen(str1)+ strlen(str2)+ 1的位置。
我问的原因是我使用上面的方法,但我在valgrind中收到错误: 条件跳转或移动取决于未初始化的值
答案 0 :(得分:11)
strcat(dest, src)
实际上做的是搜索从dest
开始并继续前进的空字节,然后在那里写src
字符串。
在malloc
之后,内存的内容是未定义的,因此您当前的代码可以执行任何数量的操作,其中大多数都是错误的。如果您在concat[0] = 0
之前strcat
进行操作,那么您的代码可以正常工作,但必须搜索str1
三次 - strlen
一次,第一个strcat
,最后一个strcat
。
相反,我推荐使用memcpy:
size_t len1 = strlen(str1), len2 = strlen(str2);
char *concat = (char*) malloc(len1 + len2 + 1);
memcpy(concat, str1, len1);
memcpy(concat+len1, str2, len2+1);
这利用了这样一个事实:你从一开始就知道你想要两个字符串的字节去哪里,以及有多少字符串。
答案 1 :(得分:4)
你想做一个strcpy然后一个strcat:
strcpy(concat, str1);
strcat(concat, str2);
strcat依赖于有一个空终止符('\ 0')来知道从哪里开始。如果你只是malloc和strcat,它会做一些讨厌的事情。
不,strcpy和strcat都不会进行任何隐式分配或重新分配。
答案 2 :(得分:4)
我个人会做以下事情:
size_t length = strlen(str1) + strlen(str2) + 1;
char *concat = malloc(sizeof(char) * length);
if(concat == NULL)
{
// error
}
snprintf(concat, length, "%s%s", str1, str2);