¿Manera correcta al espacio malloc para una cadena y luego insertar caracteres en ese espacio?

Tengo dos cadenas, str1 y str2. Quiero la concatenación de ellos en un espacio en el montón. I espacio malloc para ellos usando:

char *concat = (char*) malloc(strlen(str1) + strlen(str2) + 1); 

¿Puedo hacer:

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

¿Y concat me dará el lugar en el montón con las dos cuerdas concatted? Estoy preguntando porque parece que strcat agregaría realmente str1 al final del espacio asignado usando malloc. ¿Es esto correcto? Entonces, str1 aparecería en la posición strlen (str1) + strlen (str2) + 1.

La razón por la que pregunto es que estoy usando el método anterior, pero obtengo un error en valgrind: el salto o movimiento condicional depende de los valores no inicializados

Lo que realmente hace strcat(dest, src) es buscar el byte nulo que comienza en dest y seguir adelante, y luego escribir la cadena src allí.

Después de malloc , el contenido de la memoria no está definido, por lo que su código actual podría hacer cualquier cantidad de cosas, la mayoría de ellas incorrectas. Si concat[0] = 0 antes del strcat ‘s, entonces su código funciona pero tendrá que buscar la longitud de str1 tres veces: una vez para strlen , otra vez para el primer strcat y última para el segundo strcat .

En cambio, sin embargo, recomiendo usar 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); 

Esto aprovecha el hecho de que sabe desde el principio dónde quiere que vayan los bytes de ambas cadenas y cuántos hay.

Quieres hacer un strcpy y luego un strcat:

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

strcat confía en que haya un terminador nulo (‘\ 0’) para saber por dónde empezar. Si solo haces Malloc y Strcat, va a hacer algunas cosas desagradables.

Y no, ni strcpy ni strcat harán ningún tipo de asignación o reasignación implícita.

Yo personalmente haría lo siguiente:

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