我有两个字符串,str1和str2.我希望它们在堆中的空间上连接.我使用malloc空间:
char *concat = (char*) malloc(strlen(str1) + strlen(str2) + 1);
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
strcat(concat, str1);
strcat(concat, str2);
Run Code Online (Sandbox Code Playgroud)
concat会在堆上找到两个字符串的位置吗?我问,因为看起来strcat实际上会将str1添加到使用malloc分配的空间的末尾.它是否正确?那么,str1将出现在strlen(str1)+ strlen(str2)+ 1的位置.
那我问的原因是,我使用上面的方法,但我得到的valgrind中的一个错误:条件跳转或移动依赖于未初始化值(S)
Wal*_*ndt 12
什么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);
Run Code Online (Sandbox Code Playgroud)
这利用了这样一个事实,即从一开始就知道你想要两个字符串的字节去哪里,以及有多少字符串.
你想做一个 strcpy 然后一个 strcat:
strcpy(concat, str1);
strcat(concat, str2);
Run Code Online (Sandbox Code Playgroud)
strcat 依赖于空终止符 ('\0') 来知道从哪里开始。如果你只是 malloc 和 strcat,它会做一些讨厌的事情。
不, strcpy 和 strcat 都不会进行任何类型的隐式分配或重新分配。
我个人会做以下事情:
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);
Run Code Online (Sandbox Code Playgroud)