[C] Probleme avec malloc et les char

Statut
N'est pas ouverte pour d'autres réponses.

- Lo0

Elite
Plop tout le monde, je dois utiliser l'allocation dynamique pour un projet d'info, donc pour etre sur que j'ai bien compris ( en fait non ^^- ) je fait un petit prog

Avec des int, ca va tout seul, par contre si je remplace les int par des char ca bug

Donc ceci fonctionne nickel

Code:
	int* poo= NULL ;
	int nb,i ;
	scanf("%d", &nb);
	poo = (int*) malloc(nb * sizeof(int)) ;
	if (poo == NULL) printf("bouuuu") ;
	for ( i = 0 ; i < nb ; i++ )
	{
		scanf("%d",&poo[i]);
	}
	for ( i = 0 ; i < nb ; i++ )
	{
		printf("%d",poo[i]) ;
	}

	if (poo) free(poo) ;

par contre la, si je test le programme suivant ( en remplacent les int par les char ) et que je rentre

2
a
b

il plante a ce niveau ci :s


Code:
main()

{
	char* poo= NULL ;
	int nb,i ;
	scanf("%d", &nb);
	poo = (char*) malloc(nb * sizeof(char)) ;
	if (poo == NULL) printf("bouuuu") ;
	for ( i = 0 ; i < nb ; i++ )
	{
		scanf("%s",&poo[i]);
	}
	for ( i = 0 ; i < nb ; i++ )
	{
		printf("%s",poo[i]) ;
	}

	if (poo) free(poo) ;
}
Quelqu'un a une idée ?
 
1er
OP
- Lo0

- Lo0

Elite
Personne veut m'aider ? :beuh:
 

Jereck

Α & Ω
Staff
je ne suis pas sur qu'il faille caster (transtypper en "bon" français je crois) le résultat du malloc().
ça marche dans ton premier code parce qu'un pointeur d'entier et un entier, c'est kifkif en mémoire, donc malgré ton cast c'est ok, par contre, ça foire avec le char.

bon, je suis pas plus sur que ça hein ! 'fait lgtps que j'ai plus chipoté à ce niveau-là ...
 
1er
OP
- Lo0

- Lo0

Elite
En fait, il me dit que ca bug sur cette ligne ci


printf("%s",poo) ;


Donc ce serait plutot un probleme avec les char, comprend pas trop pourquoi.

Pour ce qui est du cast, je sais pas trop. Sur certain site, ils ne le mettent pas. Parcontre ma prof fait toujours ainsi. Doit y avoir une raison et elle a surment du expliquer pourquoi, mais je suis mauvais élève :p
 

Jereck

Α & Ω
Staff
C'est une crasse ton printf() là ... Buffer Overflow ... Tu tentes d'afficher une chaine de caractères ( %s ) qui n'a pas de terminaison ( '\0' ).

Et si même il y avait une terminaison, vu que tu le tape dans une boucle, tu aurais de joli résultats :

Pour la chaine "Bonjour\0" tu aurais : Bonjouronjourujourjouroururr affiché (tu affiches la chaine complète en boucle en partant à chaque fois d'un caractère plus loin).

:arrow: printf("%c",poo) ;


Deuxième chose, c'est bien de tester que le malloc se soit bien déroulé ( if (poo == NULL) printf("bouuuu"); ) Mais dans le cas contraire, tu affiche ton msg d'erreur (bouuuu) et tu passes quand même à la suite, aie.
 
1er
OP
- Lo0

- Lo0

Elite
A voila, j'avais oublié le /0 ^^-

Et oui j'avais pas vraiment envie de me casser la tete et je pense qu'il y a pas trop de probleme pour trouver de la place pour 2 char ^^-


Merci de l'aide ;)
 

Jereck

Α & Ω
Staff
- Lo0 a dit:
Et oui j'avais pas vraiment envie de me casser la tete et je pense qu'il y a pas trop de probleme pour trouver de la place pour 2 char ^^-
même, c'est une habitude à prendre....
 
S

Shrekju

ex membre
Tu essaies de mettre un srting dans un char et ensuite l'afficher comme un string..
%s -> %c si tu veux des char.

Dans ce cas-ci c'est un peu inutile l'alloc dynamique, un char prend 1 octet en mémoire et un pointeur prend 4 octets sous linux et 2 sous dos. Je suppose que c'etait pour comprendre le principe ;)

Si tu utilises ce principe avec des strings, tu perdras tout l'interet de l'alloc dynamique. Les profs preferent l'allocation dans la boucle avec une confirmation pour continuer (enfin à l'inpres en tout cas..). J'ai mis un exemple avec l'allocation dans la boucle. Il suffit d'ajouter un petit test pour savoir si l'utilisateur veut continuer ou non.

Code:
#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main()
{
	char * pch[3];		// Max 3 strings
	char buffer[30];	// buffer de saisie
	int nb,i=0;

	do {
		// Saisie en buffer
		printf("Entrez un mot #%d: ",i+1);
		fflush(stdin);
		scanf("%s",&buffer[0]);
		// Allocation mémoire	
		pch[i] = (char *) malloc( strlen(buffer)+1 );	// 1char = 1 octet et +1 pour \0
		if( pch[i] == NULL )
			break;
		strcpy(pch[i],buffer);
		i++;
	} while( i<3 );
	
	
	nb=i;
	printf("\n");
	
	// Affichage et liberation mémoire
	for(i=0;i<nb;i++)
	{
		printf("%2d. %s\n",i,pch[i]);
		free(pch[i]);
	}	
	return 0;
}
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut