Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

problème d'allocation mémoire en C (assez urgent)


Messages recommandés

Posté(e)

Je bloque depuis 2 jours sur un problème d'allocation de mémoire:

J'ai une structure dont un des champs est un pointeur vers une chaine de caractère (donc concrètemement pointe sur un caractère suivi d'autres caractères). Je dois allouer dynamiquement ce tableau de caractère.

Au final, je veux faire un tableau de cette structure alloué dynamiquement.

Le problème est que cette création de tableau n'est pas prise en compte en dehors de cette fonction (suivant si je renvoie un pointeur vers un tableau déclaré localement ou si je prends un pointeur au paramètre, le résultat est variable, mais ça ne marche de toute façon pas). J'ai testé avec malloc et calloc, même résultat.

Si vous pouviez me dire ce qui pose problème dans ma fonction et si possible me donner une solution alternative, ça me serait d'un grand secours.

 

Voici mon programme, raccourci pour l'occasion (normalement il y a un test pour parcourrir le tableau ce qui occasionne une faute de segmentation et le reste du programme - la compilation et l'execution de cette partie fonctionne) :

 

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#define DISK_SIZE 100

#define BLOCK_SIZE 10

 

typedef char *BLOCK;

typedef struct cache_block

{

int unsigned num_phys_block;

BLOCK block;

int unsigned prev;

int unsigned next;

char modif;

} CACHE_BLOCK;

 

int NB_BLOCKS_MEM;

 

CACHE_BLOCK *Mem_Cache;

 

void Create_Cache ( int block_size, int nb_blocks, CACHE_BLOCK *array_of_blocks )

{

int i,j;

array_of_blocks = malloc (NB_BLOCKS_MEM * BLOCK_SIZE);

assert (array_of_blocks != NULL);

 

for (i=0; i<nb_blocks; i++)

{

array_of_blocks.block = malloc (1 * block_size);

assert (array_of_blocks.block != NULL);

}

NB_BLOCKS_MEM = nb_blocks;

}

 

int main(void)

{

int i,j;

Create_Cache(BLOCK_SIZE, 12 , Mem_Cache);

return 0;

}

Posté(e)

Bon je retire ce que j'ai dit le probleme est BEAUCOUP plus profond ....

Je crois qu'il faut que je regarde en profondeur ton pb parce que t'as pas l'air de savoir trop comment ca fonctionne le passage de parametres en C et les pointeurs on dirait.

 

Automne

Posté(e)

Bon, j'ai pas pu tester (pas de compilo C sous la main) mais tu peux essayer ca :


#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#define DISK_SIZE 100

#define BLOCK_SIZE 10



typedef char *BLOCK;

typedef struct cache_block

{

int unsigned num_phys_block;

BLOCK block;

int unsigned prev;

int unsigned next;

char modif;

} CACHE_BLOCK;



int NB_BLOCKS_MEM;



void Create_Cache ( int block_size, int nb_blocks, CACHE_BLOCK **array_of_blocks )

{

int i,j;

(*array_of_blocks) = calloc (NB_BLOCKS_MEM, sizeof(CACHE_BLOCK));

assert ((*array_of_blocks) != NULL);



for (i=0; i<nb_blocks; i++)

{

(*array_of_blocks)[i].block = calloc (block_size, sizeof(char));

assert ((*array_of_blocks)[i].block != NULL);

}

NB_BLOCKS_MEM = nb_blocks;

}



int main(void)

{

int i,j;

CACHE_BLOCK *Mem_Cache;



Create_Cache(BLOCK_SIZE, 12 , &Mem_Cache);



for (i=0; i < 12; i++) 

{

Mem_Cache[i].num_phys_block = 1 + i;

Mem_Cache[i].block[0] = (char)('0' + i); 

Mem_Cache[i].prev = 1 + i;

Mem_Cache[i].next = 1 + i;

Mem_Cache[i].modif = (char)('A' + i);

}



for (i = 0; i < 12; i++)

{

if (Mem_Cache[i].block)

 free(Mem_Cache[i].block);

}

if (Mem_Cache)

free(Mem_Cache);



return 0;

}

 

tu mets un point d'arret en debug avant les liberations de mémoire et tu regardes les valeurs de Mem_Cache[0] .... Mem_Cache[11].

 

Ou alors tu affiches :P

 

Automne

Posté(e)

Excellent !

C'est pas pour te passer de la pommade, je te remercie du fond du coeur, ce truc commençait à me rendre fou. Merci aussi pour le temps que tu y as passé. En fait, ça fait 1/2h que je lutte pour te remercier (ma connection merde complètement).

J'ai testé l'affichage des cases mémoire, ça marche nickel (juste NB_BLOCKS_MEM utilisé à la place de nb_blocks à un endroit dans la fonction, bref, rien).

 

C'est clair que pour les pointeurs, j'ai du mal. J'ai commencé le C cette année (en plus j'y avais plus touché depuis 2 mois), et je les ai peu utilisé sauf pour des trucs simples. D'autant plus que j'avais demandé à quelqu'un qui s'y connait un poil plus que moi sur le sujet pour le passage en paramètre de array_of_blocks, mais il m'avait dit que c'était bon.

 

Le **array_of_blocks, c'est parce qu'on envoie l'adresse d'un pointeur, ou bien j'ai rien compris ? Enfin cette question n'est pas pressée, je compte y réfléchir plus longuement.

Posté(e)
Question piège :

NB_BLOCKS_MEM vaut combien quand tu rentres dans Create_Cache() la première fois ??

 

En effet Kewlcat, j'ai aussi oublié ca :P

Il faut initialiser NB_BLOCKS_MEM à une valeur > 0

 

Le **array_of_blocks, c'est parce qu'on envoie l'adresse d'un pointeur, ou bien j'ai rien compris ? Enfin cette question n'est pas pressée, je compte y réfléchir plus longuement.

 

C'est en effet parce que tu envoies l'adresse d'un pointeur. N'oublie pas que dans le calloc, tu modifies la valeur du pointeur. Si tu veux que cette modification soit concervée en dehors de ta fonction, il FAUT faire un passage par adresse du pointeur.

Un pointeur c'est une variable comme une autre. Meme si la syntaxe peut paraitre "spéciale", son utilisation ne differe pas d'une variable normale.

 

Automne

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...