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 allocation dynamique de char* en c


Sujet :

C

  1. #1
    Nouveau membre du Club Avatar de ethan007
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 31
    Points
    31
    Par défaut Problème allocation dynamique de char* en c
    Bonsoir à tous, je fais un projet et je viens de rencontrer un petit disfonctionnement je cherche des explications...
    J'ai un fichier qui contient la définiton d'une matrice (en première ligne du fichier on a le nombre de ligne et le nombre de colonne (de la matrice), puis la suite c'est la matrice elle même)
    EX:
    3 3
    1 2 3
    4 5 6
    7 8 9

    Mon but est d'écrire une fonction qui lit le contenu du fichier et renvoie tous ce contenu (y compris la première ligne) sous forme de char* et voici mon code (qui fonctionne..fin je pense):
    gestion_fichiers.c
    Code c : 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "gestion_fichiers.h"
     
    char *lire_fichier(char *nom_fichier){
        FILE *fichier = fopen(nom_fichier, "r");
        int nbreL = fgetc(fichier);
        nbreL = (int)nbreL - '0';//cast
        fgetc(fichier); //Espace entre le nombre de lignes et le nombre de colonnes au début du fichier
        int nbreC = fgetc(fichier);
        nbreC = (int)nbreC - '0';//cast
     
        int taille_ligne = nbreC + (nbreC -1);//La taille de la ligne à lire se calcule en incluant les espaces, pour n colonnes il y a n-1 espaces
        char *current_line_data = (char*)malloc(nbreC * sizeof(char));
        char *file_data = (char*)malloc(nbreC * nbreL * sizeof(char)+3); //will store the retrieved data # +3 is the nbreL space and nbreC
        printf("L = %d et C = %d", nbreL, nbreC);
        fseek(fichier, 0, SEEK_SET);//Get the cursor back to first ligne
        strcat(file_data, fgets(current_line_data, 4, fichier));//La première ligne du fichier
     
        if(fichier != NULL){
            while(fgets(current_line_data, taille_ligne +1, fichier)){
     
                strcat(file_data, current_line_data);//We are sure the space is enough for all datas because we calculated it earlier
            }
        }else{
            printf("The file %s doest not exist! exiting...", nom_fichier);
            exit(1);//Error can be handleled
        }
     
        free(current_line_data);
        return file_data;
    }
     
    void desallouer_donnees_fichier(char *ptr_datas){
        free(ptr_datas);
    }
    le .h:
    gestion_fichiers.h
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <stdio.h>
    #include <stdlib.h>
    char *lire_fichier(char *nom_fichier);
    void desallouer_donnees_fichier(char *ptr_datas);
    Dans le main j'appelle ma fonction avec le code suivant:
    main.c:
    Code c : 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "gestion_fichiers.h"
     
    int main(){
     
     
    printf("\n-----------GESTION DU FICHIER!-------\n");
    	char *donnees = lire_fichier("file.txt");
    	printf("Affichage des données:\n %s", donnees);
    	printf("\n-----------AUREVOIR !-------\n");
     
    	//desallouer_matrice(mat);
    	//desallouer_matrice(produit);
    	desallouer_donnees_fichier(donnees);
    	return 0;
    }

    Ce code marche bien mais lorsque je déboguait ailleurs j'ai constaté que la ligne 16 du fichier "gestion_fichiers.c" n'alloue pas un tableau de char de taille nbreC * sizeof(char)
    En réalité j'a remplacé cette ligne par:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *current_line_data = (char*)malloc(1);
    qui normalement devrait allouer 1 octet, ce qui devait me faire apparaitre une belle érreur de ségmentation (mon ami de tous les jours :p) à la ligne 24 mais au contraire tous ce passe bien : je me demande donc est ce que le fait que j'ai utilisé un malloc ou fgets le pousse recalculer la nouvelle taille à chaque tour de la boucle qui est à la lgine 24???

    Best regards.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Donc tu veux juste lire un fichier et stocker son contenu dans un char* ?
    fopen
    fseek
    ftell
    rewind
    fread
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau membre du Club Avatar de ethan007
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Bonsoir merci pour cette réponse rapide, en fait j'ai oublié de dire que c'est un projet d'école et les contraintes c'est d'utiliser uniquement fgets pour renvoyer le char*.
    or fgets en boucle écrase à chaque itération.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Ligne 16, tu n'alloues pas assez de caractères, il faut aussi réserver de la place pour le terminateur et le caractère de retour chariot.
    Ligne 17, je n'ai refait le calcul. Mais j'ai de gros doutes sur le nombre réservé.
    Ligne 20, tu concatènes dans file_data, donc tu supposes qu'initialement elle est vide, mais où est-ce fait? Et pire qu'y a-t-il dans current_line_data? On n'y a jamais rien mis.

    Maintenant pourquoi 1 semble suffire ligne 16? Si on n'alloue pas pas assez de place on a un "undefined behavior", ce qui veut dire que tout est possible et en particulier cela peut sembler fonctionner. Les caractères en trop se retrouvent dans un endroit non réservé, non prévu qui peut casser une autre partie du logiciel. Pour certains compilateurs quand on demande 1 octet on en obtient parfois 7 de plus en "cadeau", c'est ce qui doit ce passer dans ton cas.

  5. #5
    Nouveau membre du Club Avatar de ethan007
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Bonsoir
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Ligne 16, tu n'alloues pas assez de caractères, il faut aussi réserver de la place pour le terminateur et le caractère de retour chariot.
    Exact, merci
    Citation Envoyé par dalfab Voir le message
    Ligne 17, je n'ai refait le calcul. Mais j'ai de gros doutes sur le nombre réservé.
    En effet j'aurai dû penser aux espaces
    Citation Envoyé par dalfab Voir le message
    Ligne 20, tu concatènes dans file_data, donc tu supposes qu'initialement elle est vide, mais où est-ce fait?
    Bon je devrait lui affecter NULL avant de faire le malloc?
    Citation Envoyé par dalfab Voir le message
    Et pire qu'y a-t-il dans current_line_data? On n'y a jamais rien mis.
    current_line_data est rechargé à chaque tour de boucle while(gets..) de la ligne 23
    Citation Envoyé par dalfab Voir le message
    Maintenant pourquoi 1 semble suffire ligne 16? Si on n'alloue pas pas assez de place on a un "undefined behavior", ce qui veut dire que tout est possible et en particulier cela peut sembler fonctionner. Les caractères en trop se retrouvent dans un endroit non réservé, non prévu qui peut casser une autre partie du logiciel. Pour certains compilateurs quand on demande 1 octet on en obtient parfois 7 de plus en "cadeau", c'est ce qui doit ce passer dans ton cas.
    Ah soulagement je cherchait une explication là dessus, c'est donc peu être le fameux "undefined behavior" qui a de la chance d'aller dans des blocs inutilisés..
    [/QUOTE]
    Citation Envoyé par dalfab Voir le message
    Pour certains compilateurs quand on demande 1 octet on en obtient parfois 7 de plus en "cadeau", c'est ce qui doit ce passer dans ton cas
    mais pourquoi est ce que le compilateur devrait allouer ne serait-ce que 1 octet de plus alors que j'en ai demandé un nombre exact? imaginons un programmeur sur un carte avec quelques Ko..

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par ethan007 Voir le message
    mais pourquoi est ce que le compilateur devrait allouer ne serait-ce que 1 octet de plus alors que j'en ai demandé un nombre exact? imaginons un programmeur sur un carte avec quelques Ko..
    Cela n'est pas à cause de ton compilateur mais de ton processeur et c'est ce qu'on appelle l'alignement.

    Sur une machine de quelque ko , les contraintes ne sont pas les mèmes et donc un processeur 8 bits n'a aucune mal a gérer la mémoire si elle n'est pas aligné.
    (Mais si tu as vraiment besoin d'économiser la mémoire jusqu'a ce que la pile te pose souci , alors tu peux aller en assembleur).

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 106
    Points
    43 106
    Par défaut
    Cela n'est pas à cause de ton compilateur mais de ton processeur et c'est ce qu'on appelle l'alignement.
    Oui, mais rien n'empêche le compilateur de rajouter des octets. C'est notamment le cas avec la stack smashing protection de gcc, qui va aussi ajouter un canari pour se protéger d'une corruption de pile. Il doit y avoir le même système sous Windows.

    Pour ceux qui ne le savent pas, le canari est une valeur qui sert à vérifier que la pile n'a pas été corrompue, c'est utilisé par le système de prologue/épilogue des fonctions.
    Le terme canari est utilisé en référence aux canaris utilisés dans les mines de charbon. Quand le canari ne chantait plus, un coup de grisou était probable et la mine était évacuée.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par ethan007 Voir le message
    Bon je devrait lui affecter NULL avant de faire le malloc?
    Avant malloc!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // que fait ce code ?
    char *current_line_data = "hello";
    current_line_data = NULL;
    current_line_data = malloc(nbreC +2);
    // ou, même question, que fait ce code ?
    double a = 3.14159;
    a = 0;
    a = 5 * 3;
    Après malloc, on peut initialiser le 1er caractère à '\0' ou commencer par strcpy() plutôt qur strcat().
    Citation Envoyé par ethan007 Voir le message
    current_line_data est rechargé à chaque tour de boucle while(gets..) de la ligne 23
    Et par quelle magie, en ligne 20 c'est déjà rempli?
    Citation Envoyé par ethan007 Voir le message
    mais pourquoi est ce que le compilateur devrait allouer ne serait-ce que 1 octet de plus alors que j'en ai demandé un nombre exact? imaginons un programmeur sur un carte avec quelques Ko..
    J'ajoute aux réponses précédentes que sur les cartes avec quelques Ko (c'est mon métier) on n'alloue jamais rien saufs de rares grands blocs (c-a-d quelques centaines d'octets), la perte relative est donc négligeable.

  9. #9
    Nouveau membre du Club Avatar de ethan007
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par dalfab Voir le message

    Et par quelle magie, en ligne 20 c'est déjà rempli?
    La fonction fgets copie le flux lu dans le chaine passée en paramètre donc même si il y a déja quelque chose, cette chose est écrasée..non?

    Citation Envoyé par Kannagi Voir le message
    Cela n'est pas à cause de ton compilateur mais de ton processeur et c'est ce qu'on appelle l'alignement.

    Sur une machine de quelque ko , les contraintes ne sont pas les mèmes et donc un processeur 8 bits n'a aucune mal a gérer la mémoire si elle n'est pas aligné.
    (Mais si tu as vraiment besoin d'économiser la mémoire jusqu'a ce que la pile te pose souci , alors tu peux aller en assembleur).
    Ah ce fameux alignement je pense que tu répond à la principale question du sujet.

    peu être le sujet est RESOLU+1

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ethan007 Voir le message
    La fonction fgets copie le flux lu dans le chaine passée en paramètre donc même si il y a déja quelque chose, cette chose est écrasée..non?
    Le souci ne vient pas de fgets() mais de strcat(). Car l'élément sur lequel tu l'appliques n'est pas une chaine. C'est un simple pointeur alloué et non initialisé.

    Reprenons la base: la fonction strcat(str1, str2) va concaténer str2 à la suite de str1. Donc elle commence par se placer à la fin de str1 pour y rajouter str2. Mais pour trouver la fin de str1, elle se base sur le '\0' sensé s'y trouve.
    Si str1 n'est pas une chaine, alors il n'a pas de '\0' et donc strcat() ne peut pas se caler dessus.

    Donc 2 façons de faire
    1. tu garantis que str1 (ici file_data) est bien une chaine en lui mettant un '\0' à la main (ex file_data[0]='\0'). C'est parfaitement autorisé et ça fonctionne. Ensuite tu peux y faire du strcat() autant que tu voudras
    2. tu ne lui fais pas une concaténation mais une initialisation (ex strcpy(file_data, fgets(...)).

    Bref en résumé tu t'arranges pour que file_data soit une chaine avant de lui appliquer la moindre opération sous-entendant une lecture de chaine.

    Citation Envoyé par ethan007 Voir le message
    mais pourquoi est ce que le compilateur devrait allouer ne serait-ce que 1 octet de plus alors que j'en ai demandé un nombre exact? imaginons un programmeur sur un carte avec quelques Ko..
    Optimisation. Tu demandes 1 et le truc t'en alloues un gros stock pour pas appeler le lourd mécanisme d'allocation pour presque rien. T'as la fonction getpagesize() qui donne la taille d'une page mémoire (chez-moi 4096). Généralement, une allocation de "n" se traduira par une allocation de "m" ("m" étant le plus petit nombre supérieur ou égal à "n" et multiple entier d'une taille de page). Ensuite, si tu agrandis la zone de "n" à "n2" mais que "n2" reste inférieur à "m", le bouzin se contente de déplacer un flag mais sans tout remettre en branle.
    Mais que cela ne t'empêche pas de bien gérer ton besoin. Si tu as besoin de 5, tu alloues 5 et pas 1 en te disant "bof de toute façon j'aurai 4096".

    Toutefois tu dois bien sentir qu'une allocation de "1" c'est un peu ridicule. Donc tu peux toi-aussi définir ton propre mécanisme de bufferisation. Style tu alloues 256 (même si tu n'as besoin que de 5) mais tu mémorises la taille allouée et la taille utilisée. Ensuite, quand ton truc grandis, tu déplaces la taille utilisée et si celle-ci atteint la taille allouée, alors là seulement tu agrandis.

    Petit exemple d'allocation en fonction du besoin

    Code c : 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
    typedef struct {
    	char *zone;
    	char *tmp;
    	size_t alloue;
    	size_t rempli;
    } t_memory;
     
    t_memory buffer;
    buffer.zone=NULL;
    buffer.alloue=0;
    buffer.rempli=0;
     
    while (lecture(info)) {
    	// Vérification besoin agrandissement buffer
    	if (buffer.alloue == buffer.rempli) {
    		// Agrandissement
    		buffer.alloue+=N
    		buffer.tmp=realloc(buffer.zone, buffer.alloue * sizeof(char));		// Si la zone est à NULL, realloc se comporte comme malloc
     
    		// Echec allocation ?
    		if (buffer.tmp == NULL) {
    			// Gestion du problème (généralement libération et sortie)
    			free(buffer.zone);			// Heureusement que je n'ai pas perdu "zone" (cette ligne est la seule et unique raison d'exister de "tmp") !!!
    			return ...;
    		}
     
    		// Ici le buffer temporaire a été agrandi (ou alloué à la première itération) - On le récupère dans la zone
    		buffer.zone=buffer.tmp;
    	}
     
    	// Ici, soit on est passé dans le "if" soit on n'y est pas passé mais dans les deux cas on est certain d'avoir la place pour y stocker l'information lue
    	// Et cette information sera bien évidemment stockée à l'index de remplissage actuel
    	buffer.zone[buffer.rempli]=info;
     
    	// On a rempli une info de plus
    	buffer.rempli++;
    }
     
    // Ici, "buffer.rempli" contient le nombre réel d'info contenues dans la zone, et "buffer.alloue" contient la taille allouée
    ...		// Il n'y a plus qu'à traiter...

    Ensuite, te suffit de définir N à ton choix pour moduler cet algorithme en fonction de ta machine cible.
    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]

  11. #11
    Nouveau membre du Club Avatar de ethan007
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    ...
    ....
    Petit exemple d'allocation en fonction du besoin

    Code c : 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
    typedef struct {
    	char *zone;
    	char *tmp;
    	size_t alloue;
    	size_t rempli;
    } t_memory;
     
    t_memory buffer;
    buffer.zone=NULL;
    buffer.alloue=0;
    buffer.rempli=0;
     
    while (lecture(info)) {
    	// Vérification besoin agrandissement buffer
    	if (buffer.alloue == buffer.rempli) {
    		// Agrandissement
    		buffer.alloue+=N
    		buffer.tmp=realloc(buffer.zone, buffer.alloue * sizeof(char));		// Si la zone est à NULL, realloc se comporte comme malloc
     
    		// Echec allocation ?
    		if (buffer.tmp == NULL) {
    			// Gestion du problème (généralement libération et sortie)
    			free(buffer.zone);			// Heureusement que je n'ai pas perdu "zone" (cette ligne est la seule et unique raison d'exister de "tmp") !!!
    			return ...;
    		}
     
    		// Ici le buffer temporaire a été agrandi (ou alloué à la première itération) - On le récupère dans la zone
    		buffer.zone=buffer.tmp;
    	}
     
    	// Ici, soit on est passé dans le "if" soit on n'y est pas passé mais dans les deux cas on est certain d'avoir la place pour y stocker l'information lue
    	// Et cette information sera bien évidemment stockée à l'index de remplissage actuel
    	buffer.zone[buffer.rempli]=info;
     
    	// On a rempli une info de plus
    	buffer.rempli++;
    }
    ......
    .......
    Parfait, c'est fou cette histoire de mémoire. là je comprend pourquoi mon code faisait un peu du n'importe quoi. MERCI

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

Discussions similaires

  1. problème allocation dynamique dans C++
    Par mido1951 dans le forum C++
    Réponses: 16
    Dernier message: 23/04/2013, 21h38
  2. problème allocation dynamique tableau 2d
    Par virtual_bug dans le forum C++
    Réponses: 16
    Dernier message: 17/04/2012, 11h21
  3. Réponses: 4
    Dernier message: 06/05/2008, 13h12
  4. Problème allocation dynamique ?
    Par Dark_Alex69 dans le forum C
    Réponses: 15
    Dernier message: 20/11/2007, 15h44
  5. problème allocation dynamique
    Par josef24 dans le forum Débuter
    Réponses: 6
    Dernier message: 12/11/2007, 12h31

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