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

Kel*_*elp 7 c

我有两个字符串,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)

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

  • 这里不要使用'memmove`; 这令人困惑.任何使用'memmove`都应该用来记录你正在做一些非常不同和不同寻常的事情.如果我在这里看到"memmove",我会花一两分钟试图找出为什么#*$ @有人使用它,如果有什么可疑的话...... (4认同)

Chr*_*rle 5

你想做一个 strcpy 然后一个 strcat:

strcpy(concat, str1);
strcat(concat, str2);
Run Code Online (Sandbox Code Playgroud)

strcat 依赖于空终止符 ('\0') 来知道从哪里开始。如果你只是 malloc 和 strcat,它会做一些讨厌的事情。

不, strcpy 和 strcat 都不会进行任何类型的隐式分配或重新分配。


Tim*_*per 5

我个人会做以下事情:

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)

  • 不要使用 `strlen` 来计算长度。使用 `length=snprintf(0,0,"%s%s",str1,str2);` 或者只使用 `asprintf`(并确保包含你自己的版本 - 它是围绕 `snprintf` 的一个简单的包装器 - 对于系统不包括这个 GNU 扩展)。 (2认同)
  • R在上面的评论的理由(必须阅读以理解建议):http://stackoverflow.com/a/5615561/340236 (2认同)