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

时间:2011-04-10 20:15:15

标签: c

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

3 个答案:

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