[C] Probleme avec malloc et les char

Discussion dans 'Web, design' créé par - Lo0, 21 Février 2007.

Statut de la discussion:
Fermée.
  1. Offline
    - 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 :p- ) 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 ?
    - Lo0, 21 Février 2007
    #1
  2. Offline
    - Lo0 Elite
    Personne veut m'aider ? :beuh:
    - Lo0, 21 Février 2007
    #2
  3. Offline
    Jereck Procrastinateur
    Equipe GamerZ.be
    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à ...
    Jereck, 21 Février 2007
    #3
  4. Offline
    - 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
    - Lo0, 21 Février 2007
    #4
  5. Offline
    Jereck Procrastinateur
    Equipe GamerZ.be
    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.
    Jereck, 21 Février 2007
    #5
  6. Offline
    - Lo0 Elite
    A voila, j'avais oublié le /0 :p-

    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 :p-


    Merci de l'aide ;)
    - Lo0, 21 Février 2007
    #6
  7. Offline
    Jereck Procrastinateur
    Equipe GamerZ.be
    même, c'est une habitude à prendre....
    Jereck, 21 Février 2007
    #7
  8. Offline
    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;
    }
    
    Shrekju, 22 Février 2007
    #8
Statut de la discussion:
Fermée.