IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème avec malloc sizeof


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Par défaut Problème avec malloc sizeof
    Bonjour toutes et à tous,

    J'ai un problème d'ajout de chaîne de caractères dans un tableau de pointeur char* qui est doit contenir l'adresse IP tapé après un CONNECT
    exemple:
    CONNECT 1.1.1.1.

    Je poste mon code si vous arrivé avoir c'est quoi qui cloche dans mon programme.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
     
    #define PORT 5555 // the port client will be connecting to 
     
    #define MAXDATASIZE 100 // max number of bytes we can get at once 
     
    #define IP_ADDR "127.0.0.1"
     
    /*
    LE clien 
    */
     
    int main(int argc, char *argv[])
    {
    	int sockfd, numbytes,i,j;
    	int nbs=0;
    	char buf[MAXDATASIZE];
    	char *ServerAdr[4];//tableau de 4 adresse
    	for(i=0;i<4;i++)ServerAdr[i]="vide";//initialisation
    	char cp[255];
    	char *ligne,*Pligne;
    	struct sockaddr_in sock_server; //structure qui va contenir les information sur le serveur
    	int s;
     
    	while(gets(ligne)){
    		//la ligne entré par l'utilisateur
     
    		if(!strcmp(ligne,"exit"))exit(0);
     
    		strcpy(cp,ligne);
    		Pligne=strtok(ligne," ");
    		if(!strcmp(Pligne,"CONNECT")){//la cas d'une connection
    			Pligne=strtok(NULL," ");//on pointe sur l'adresse ip à stocker
    			//stockage de l'adresse du serveur
    			for(j=0;j<4;j++) printf("cette adresse AVANT: %s\n",ServerAdr[j]);
    			for(i=nbs;i<4;i++){
    			//on parcoure le tableau des serveurs jusqu'à ce qu'on trouve une place libre
    					printf("valeur pour i = %d: %s\n",i,ServerAdr[i]);
    				if(!strcmp(ServerAdr[i],"vide")){
    					//ServerAdr[i]=Pligne;
    					ServerAdr[i]=(char *)malloc(sizeof(*Pligne));
    					strcpy(ServerAdr[i],Pligne);
    					printf("Cette adresse vient d'etre ajouté:%s dans l'indice %d \n",ServerAdr[i],i);
     
    					nbs++;
    					break;
    				}
     
    			}
     
     
    		}
     
    		//else{//le cas d'un envoie de message
     
    			for(j=0;j<4;j++){
     
    				printf("cette adresse APRES: %s\n",ServerAdr[j]);
     
    // 				if(strcmp(ServerAdr[j],"vide")){
    // 				printf("Ce message: %s pour ",cp);
    // 				printf("cette adresse: %s\n",ServerAdr[j]);
    // 				}
    			}
     
    		//ligne=NULL;
    		//}
    	}	
    	return 0;
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	char *ligne,*Pligne;
    ...
    	while(gets(ligne)){...
    ligne doit être un tableau, pas un simple pointeur.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	char *ligne,*Pligne;
    ...
    	while(gets(ligne)){...
    ligne doit être un tableau, pas un simple pointeur.
    je pense pas que c'est à cause de ça que ca ne marche pas.
    c'est peut etre gets qui s'occupe d'alouer la mémoire.

    j'ai remarqué qu'il suffit de commenter les deux ligne malloc et strcpy pour que le prog marche, mais sans faire grand chose

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il ne faut pas non plus oublier de remplacer gets par fgets et de libérer la mémoire allouée par malloc avant d'appeler exit.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par BATAK Voir le message
    je pense pas que c'est à cause de ça que ca ne marche pas.
    c'est peut etre gets qui s'occupe d'alouer la mémoire.

    j'ai remarqué qu'il suffit de commenter les deux ligne malloc et strcpy pour que le prog marche, mais sans faire grand chose
    Il faut cesser le bricolage. gets() n'alloue rien du tout et de toutes façons, son interface ne permettrait pas de récupérer l'adresse du bloc alloué.

    D'autre part gets() est une fonction dangereuse, car il n'y a aucun moyen de limiter le nombre de caractères saisis.

    Je ne sais pas ce que tu cherches à faire, mais tu devrais commencer par réviser les bases du langage C.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    D'autre part gets() est une fonction dangereuse, car il n'y a aucun moyen de limiter le nombre de caractères saisis.
    D'ailleurs depuis le TC3 de C99, il ne faut officiellement plus l'utiliser :
    7.26.9 Input/output <stdio.h>
    1 Lowercase letters may be added to the conversion specifiers and length modifiers in
    fprintf and fscanf. Other characters may be used in extensions.
    2 The gets function is obsolescent, and is deprecated.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BATAK Voir le message
    c'est peut etre gets qui s'occupe d'alouer la mémoire.
    Peut-être. Si c'est ça la doc te le dira...

    Citation Envoyé par BATAK Voir le message
    j'ai remarqué qu'il suffit de commenter les deux ligne malloc et strcpy pour que le prog marche, mais sans faire grand chose
    Comportement indéterminé => parfois ça marche, parfois ça marche pas mais en tout cas c'est mal écrit.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 12
    Par défaut
    bon ok si j'ai bien compris le problème vient du fait que j'utilise gets, LA FONCTION A NE JAMAIS UTILISER!

    Autant pour moi je vais la remplacer avec fgets ou fscanf ça devrais le faire.

    pour ceux qui n'arrive pas à voir ce que je veux faire, c'est qu'à chaque fois que l'utilisateur tape CONNECT X.X.X.X
    je recupère l'adresse ip qui suis le CONNECT et je la stock dans le tableaux serverAdr[];
    Le programme récupère tout le temps ce que le ce que l'utilisateur tape, si il y a un CONNECT il stocke l'adresse sinon il considère ça comme une phrase qui va envoyer à tout les serveurs stockés dans le tableau serverAdr[] (en udp).

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Attention, fgets() te permettra de contrôler de nombre de caractères saisis, mais ne va pas allouer de la mémoire pour toi. Il te faut donc utiliser un tableau de caractères alloué statiquement ou allouer la mémoire dynamiquement avec malloc() (et bien entendu ne pas oublier de la libérer après usage).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec malloc
    Par cyril_sy dans le forum C
    Réponses: 13
    Dernier message: 12/05/2007, 13h49
  2. Problème avec malloc et autre
    Par ego dans le forum C
    Réponses: 5
    Dernier message: 02/05/2007, 18h29
  3. probléme avec malloc
    Par tomasi dans le forum C
    Réponses: 18
    Dernier message: 15/11/2006, 15h15
  4. Problème avec malloc
    Par f56bre dans le forum C
    Réponses: 11
    Dernier message: 13/11/2006, 14h36
  5. Problème avec malloc.
    Par kmitz dans le forum C
    Réponses: 2
    Dernier message: 25/03/2006, 18h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo