Manière correcte de malloc pour une chaîne, puis insérer des caractères dans cet espace?

J’ai deux chaînes, str1 et str2. Je veux leur concaténation sur un espace dans le tas. Je malloc un espace pour eux en utilisant:

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

Puis-je simplement faire:

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

Et concat me donnera la place sur le tas avec les deux cordes concattées? Je demande parce qu’il semble que strcat appendait réellement la str1 à la fin de l’espace alloué en utilisant malloc. Est-ce correct? Ainsi, str1 apparaîtrait donc à la position strlen (str1) + strlen (str2) + 1.

La raison pour laquelle je pose cette question est que j’utilise la méthode ci-dessus, mais j’obtiens une erreur dans valgrind: le saut ou le déplacement conditionnel dépend de valeurs non initialisées.

Ce que fait strcat(dest, src) est de rechercher l’octet nul commençant à dest et allant de l’avant, puis d’écrire la chaîne src cet emplacement.

Après malloc , le contenu de la mémoire n’est pas défini, votre code actuel peut donc effectuer toutes sortes de tâches, dont la plupart sont incorrectes. Si vous concat[0] = 0 avant le strcat , votre code fonctionnera mais devra rechercher trois fois la longueur de str1 – une fois pour strlen , toujours pour le premier strcat et pour le second strcat .

Au lieu de cela, je recommande d’utiliser 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); 

Cela tire parti du fait que vous savez dès le départ où vous voulez que les octets des deux chaînes soient acheminés et combien ils en ont.

Vous voulez faire une strcpy puis une strcat:

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

strcat s’appuie sur la présence d’un terminateur nul (‘\ 0’) pour savoir par où commencer. Si vous ne faites que malloc et strcat, il va faire des choses désagréables.

Et non, ni strcpy ni strcat ne feront quoi que ce soit d’allocation implicite ou de réallocation.

Je voudrais personnellement faire ce qui suit:

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