[C++] new[] modifié mais reste à NULL

Résolu/Fermé
axel50397 Messages postés 113 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 17 mars 2014 - 29 oct. 2010 à 03:26
axel50397 Messages postés 113 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 17 mars 2014 - 29 oct. 2010 à 22:24
Bonjour,

Je ne savais pas trop comment expliquer mon problème.

Voila, je me suis fais une fonction "strsplit" à laquelle on envoie 3 paramètres char *.
En fait, on envoie 2 chaines vides, et une 3e chaine de caratères, remplie.
La fonction se charge de copier dans le 1er paramètre la 3e chaine jusqu'à rencontrer un espace, et copier le reste dans le 2e paramètre.

Dans une classe, j'ai donc créé 2 pointeurs dynamiques, que j'envoie à ma fonction:
char buffer[] = "Bonjour, comment allez vous?";

char * code = NULL;
char * message = NULL;

strsplit(code, message, buffer);


Voici le traitement:
void strsplit(char * dest1, char * dest2, const char * src)
{
	bool o; // Marquera la fin du comptage
	char t, u[] = {' ', '\0', '\n'}; // Les caractères de fin de la 1ere chaine
	int i, j;
	int l_src = strlen(src);
	int l_dest1=0, l_dest2=0;

	for (i=0;i<l_src;i++) // Définition taille Dest1
	{
		o = true;

		for (j=0;j<strlen(u);j++)
			if (src[i] == u[j])
				o = false;
		
		if (o)
			l_dest1++;
		else
			break;
	}

	dest1 = new char[l_dest1+1]; // +1 pour le caractère de fin de chaine
	strncpy(dest1, src, l_dest1);
	dest1[l_dest1] = '\0';

	l_dest2 = l_src - l_dest1 - 1; // -1 pour l'espace entre les deux

	dest2 = new char[l_dest2+1]; // +1 pour le caractère de fin de chaine
	strncpy(dest2, &src[l_dest1+1], l_dest2);
	dest2[l_dest2] = '\0';
}


Mon problème est qu'en mettant des "std::cout << dest1;" DANS la fonction, cela s'affiche correctement, mais en sortant de la fonction, les std::cout affichent (null)...

C'est comme si dans la fonction, les pointeurs étaient bien réassignés, mais en sortant avaient conservés leurs valeurs d'origine.

Quelqu'un pourrait m'expliquer à quoi cela est dû et éventuellement comment résoudre le problème ?

Merci de votre aide !

3 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
29 oct. 2010 à 08:53
^%Salut.
règle de base en C : les passages par argument à une fonction se font par copie.
si tu as f(type x), et que tu appels la fonction ainsi :"f(y);" en gros l'ordinateur fait :
f(type x=y){x=...}
Donc y n'est jamais modifié.
Dans ton cas, type est "char*".
tu as y=NULL; et sa valeur ne changera pas.
Si tu veux modifier la valeur, il faut passer l'adresse de ta variable.

Tu fais du C++, utilise std::string, et le passage par référence, ça sera nettement plus simple.
2
axel50397 Messages postés 113 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 17 mars 2014 16
29 oct. 2010 à 11:48
Salut,

J'y ai effectivement déjà pensé, mais là où ça passait pas dans la tête... C'est le cas de strcpy?

Pourquoi dans ce cas, quand on fait strcpy(x, y), ce serait différent?
A moins bien sûr que strcpy utilise des références? (sauf si je me trompe...)

Je comptais justement passer par les strings, mais je voulais d'abord comprendre
Mon erreur =)

Merci a toi!
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
29 oct. 2010 à 12:09
dans strcpy, tu ne modifie pas x, mais les valeurs pointé.
x=new => modifie x
*x=*y => ne modifie pas x, modifie les cases mémoires pointées par x.
Il faut bien faire attention de quoi on parle et ce qui est modifié.
En toute logique, on ne fait pas de new sans un delete dans le même corps de fonction (Il y a bien sur plein d'exceptions, mais en général c'est explicite).
C'est le problème du C, à tout instant, ou presque, il faut jongler avec l'allocation mémoire. Plus de souci avec string, l'allocation est encapsulé dans la classe.
0
axel50397 Messages postés 113 Date d'inscription mercredi 8 août 2007 Statut Membre Dernière intervention 17 mars 2014 16
29 oct. 2010 à 22:24
Merci beaucoup...

J'ai eu un peu de mal à comprendre, mais j'ai finis par faire des passages par référence.

++
0