Aller au contenu


Photo
- - - - -

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


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 Reika2000

Reika2000

    Extrem Member

  • Membres
  • 879 messages

Posté 18 avril 2002 - 06:58

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[i].block = malloc (1 * block_size);
assert (array_of_blocks[i].block != NULL);
}
NB_BLOCKS_MEM = nb_blocks;
}

int main(void)
{
int i,j;
Create_Cache(BLOCK_SIZE, 12 , Mem_Cache);
return 0;
}
  • 0

PUBLICITÉ

    Annonces Google

#2 automne

automne

    Full Patch Member

  • Membres
  • 1 901 messages

Posté 18 avril 2002 - 10:04

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
  • 0

#3 automne

automne

    Full Patch Member

  • Membres
  • 1 901 messages

Posté 18 avril 2002 - 11:05

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
  • 0

#4 KewlCat

KewlCat

    Modérateur

  • Attente Validation
  • 24 812 messages

Posté 19 avril 2002 - 12:04

Question piège :
NB_BLOCKS_MEM vaut combien quand tu rentres dans Create_Cache() la première fois ??
  • 0

#5 Reika2000

Reika2000

    Extrem Member

  • Membres
  • 879 messages

Posté 19 avril 2002 - 12:18

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.
  • 0

#6 automne

automne

    Full Patch Member

  • Membres
  • 1 901 messages

Posté 19 avril 2002 - 09:38

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
  • 0









Sujets similaires :     x