Probleme malloc

ceeno Messages postés 34 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 1 juillet 2007 - 20 nov. 2003 à 21:42
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 21 nov. 2003 à 11:32
Bonjour à tous,

Je cherche a crée un tableau dont j'augmente la mémoire à chaque fois que je veu y enregistrer une nouvelle valeur.
Mais je n'y arrive pas...
Voici ce ke je fais :

typedef struct cps
{
float val;
int nb;
} cps_t;

cps_t * VC;
VC=(cps_t *)malloc(sizeof(cps_t));
VC[k].val=0;
VC[k].nb=0;

Puis pour agrandir d'une case VC :
VC=(cps_t *)malloc(sizeof(VC)+1);

Si quelqu'un pouvait m'aider ca serais sympa!

Merci d'avance!

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 nov. 2003 à 00:28
VC=(cps_t *)malloc(sizeof(VC)+1); NENNI !!!
malloc demande la taille voulue en OCTETS, donc sizeof(VC) + 1 octet n'ira pas.
malloc(sizeof(VC)*2); pour 2 struct, etc...
Si tu dois augmenter la taille a l'execution va jeter un oeil du cote des listes chainees ou arbres binaires, a voir selon les besoins.
BruNews, ciao...
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
21 nov. 2003 à 09:33
oui, ou alors essaie d'incrémenter le bon nombre d'octets... sizeof(VC)+sizeof(cps_t)...

Vaughn018, Siaïeï handler...
0
ceeno Messages postés 34 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 1 juillet 2007
21 nov. 2003 à 10:27
Merci pour vos réponse, mais cela ne fonctionne pas, le programme bloque systématiquement.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 nov. 2003 à 10:42
Deja une connerie pour moi, je n'avais pas fait attention car j'ai l'habitude de ne JAMAIS mettre le nom de variable dans le sizeof mais le nom de struct.
Et oui, sizeof d'un pointeur risque fort de donner 4 au lieu de la taille exacte requise pour la struct.
donc:
malloc(sizeof(cps_t)*2); pour 2 struct, etc...
BruNews, ciao...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
21 nov. 2003 à 10:52
exact, meme erreur pour moi: à remplacer par sizeof(cps_t)*nbstruct + sizeof(cps_t) si tu incrémentes la taille

Vaughn018, Siaïeï handler...
0
ceeno Messages postés 34 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 1 juillet 2007
21 nov. 2003 à 11:15
j'ai essayé avec ce que tu m'as dit, et le programme ne plante pas, le seul probleme est k'a chake allocution, les valeurs de VC sont perdues.
Voici mon programme test :

typedef struct cps
{
    float val;
    int nb;
} cps_t;

affiche( cps_t * VC)
{
    int i;
    printf("\n{");
    for (i=0;i<2;i++)
    {
        printf("(%f,%d)",VC[i].val,VC[i].nb);
    }
    printf("}");
}

main()
{
  cps_t * VC;
  VC=(cps_t *)malloc(sizeof(cps_t));
  VC[0].val=3.3;
  VC[0].nb=5;
  VC=(cps_t *)malloc(sizeof(cps_t)*2);
  VC[1].val=4.4;
  VC[1].nb=8;
  affiche(VC);
  getch();
}
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 nov. 2003 à 11:23
Pour cela que serait mieux de gerer en liste chainee avec un pointeur Next sinon tu devras passer par du realloc qui demande un gros boulot au memory manager.
BruNews, ciao...
0
ceeno Messages postés 34 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 1 juillet 2007
21 nov. 2003 à 11:26
Ok, donc c'est impossible avec malloc seulement. En tout cas,merci à BruNews et Vaughn018 pour vos réponses.
0
Vaughn018 Messages postés 55 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 janvier 2005
21 nov. 2003 à 11:31
Dans le fond je rejoin Brunews sur le fait que c'est pas très cohérent pour augmenter la taille dynamiquement, le malloc devant en principe etre utilisé une fois seulement. Ya du realloc() possible mais je crois que le mieux à faire est d'implémenter une petite liste chainée :
typedef struct cps {
float val;
int nb;
struct cps *suivant;
}cps_t;

Pour créer un objet de ce type, tu devrais déclarer une fonction qui déclare un cps_t * dont tu initialises les champs, avec le champ suivant à la valeur NULL. Ensuite lorsque tu crées un nouvel élément, il ne faut pas oublier de rattacher au précédent à l'aide du champ suivant toujours...

Vaughn018, Siaïeï handler...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 nov. 2003 à 11:32
Tu peux avec malloc seul mais c'est tu dois affecter sur un pointeur temp, recopier ton ancien tableau, free de ancien pointeur et en finale pointeur = temp. Ce n'est pas efficace.
BruNews, ciao...
0
Rejoignez-nous