正确的方法来malloc空间的字符串,然后将字符插入该空间?

我有两个字符串,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中收到错误:条件跳转或移动取决于未初始化的值(s)

strcat(dest, src)实际上做的是从dest开始向前搜索一个空字节,然后在那里写src字符串。

malloc之后, malloc的内容是未定义的,因此您当前的代码可以执行任何数量的操作,其中大多数都是错误的。 如果你在strcat之前做concat[0] = 0 ,那么你的代码可以工作,但是必须搜索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); 

这利用了这样一个事实,即你从一开始就知道你想要两个字符串的字节去哪里,以及有多少字符串。

你想做strcpy然后strcat:

 strcpy(concat, str1); strcat(concat, str2); 

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);