Forum Clubic

Erreur segmentation strncat

bonjour,
j’ai un problème avec strncat qui me fait une erreur de segmentation.
dans le code suivant, jstring est une structure contenant un char* et un entier (la taille de la chaine).
le but est de faire une fonction qui prends comme paramètres 2 jstrings (string1 et string2) et qui ajoute la chaîne de string1 à la chaîne de string2.
voici mon code:


 string1->length=string1->length+string2->length
 strncat ( string1->characters, string2->characters, string2->length);

ce que je me suis dit, c’est que peut-être il faudrait réallouer de la place à la fin de la première chaine pour pouvoir ajouter la 2ème? je pensais à ça:


string1->characters=(char*)malloc(jstring2->length*sizeof(char))

mais je suis pas sur, est-ce que ça va allouer de la mémoire à la suite ou réinitialiser ??

je vous remercie de votre aide

Si j’ai bien compris ce que tu veux : malloc réinitialise. Tu peux tenter realloc (voir man). Le mieux étant de faire ça en deux étapes :

char* old = string1->characters;
char* new = ... malloc ...
if (NULL != new) {
	string1->characters = new;
	free(old);
} else {
  ERREUR
}

ouaip, c’était bien un problème d’initialisation. merci!
et merci pour la précision malloc réinitialise, toujours bon à savoir pour la suite!

Pour allouer de la mémoire “à la suite” encore faudrait-il qu’il connaisse le buffer à étendre or la seule info qu’on lui donne c’est une taille à allouer (contrairement à realloc qui lui prend aussi l’adresse d’un buffer en paramètre). Possible que ce nouveau buffer se retrouve à la suite de l’ancien mais dans ce cas c’est une pure coincidence. :wink:

Malloc ne fait que réserver une zone mémoire dans la mémoire libre et renvoie un pointeur vers cette zone.

(dis-moi si je me trompe)

est-ce que tu veux dire que si je connais la taille de la chaîne que j’aimerais agrandir, je peux réallouer de la mémoire à partir de la fin ? (L’augmenter quoi)

en faisant par exemple string1->characters[i]= (char*)malloc(sizeof(char)) ??? (avec le i dans une boucle et qui commence sur le dernier caractère?

Non. Sauf à manipuler la mécanique interne de malloc/free (et je ne te le conseille pas), tu n’as d’autres choix que 1) allouer une zone mémoire correspondant à l’ancienne + ce que tu ajoutes 2) recopier la chaine actuelle sur ton nouveau char* 3) recopier après la chaîne actuelle ce que tu ajoutes 4) libérer l’ancienne (“chaine actuelle”)

ouai ok je m’en doutais. dommage !!
merci en tout cas

Non, “connaitre le buffer” = connaitre son adresse (c’est l’adresse du buffer que tu passes en paramètre à free ou realloc, pas la taill). Si tu ne connais que la taille ça ne suffit pas, tu n’es pas le seul dans le système à allouer des buffers de cette taille.

realloc doit faire ça; ie: ça agrandit si possible sinon ça déplace.