CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]Question débutant sur structure

le-fou-FURAX
le-fou-FURAX
Niveau 7
28 février 2014 à 09:46:33

Salut a tous !

Je voudrais créer une structure strBuf qui a comme attribut debutchaine (un pointeur sur char) et capacite (entier qui indique sa capacité max).

j'aimerai pouvoir lui faire stocker des chaines de caractères et réagrandire la structure si le besoin s'en ressant mais je n'arrive pas a utiliser l'allocation dynamique de la mémoire !

Quelle taille je dois lui donner par exemple pour stocker la chaine bonjour et un entier qui indique combien de caractère au max la chaine peut contenir ? J'ai tout essayé je déséspère :(

le-fou-FURAX
le-fou-FURAX
Niveau 7
28 février 2014 à 10:21:29

Je déclare ma structure *strBuf dans la main puis je fais appel a la fonction suivante :

void initBuf(strBuf* buf,int capa){
buf = malloc(sizeof(strBuf)+capa*sizeof(char)+sizeof(int
));

(*buf).capa=capa;

et la bim plantage.

benjisop
benjisop
Niveau 10
28 février 2014 à 13:27:48

Salut,

Ton allocation est foireuse.

buf = malloc(sizeof(strBuf)) est amplement suffisant, à moins que tu ne veuilles faire de buf un tableau. En effet, sizeof calcule la taille de ce que tu lui passes, donc si c'est une structure, il calculera la taille de ladite structure. Après c'est à toi de gérer la mémoire pour ton char*.

Et de plus, (*buf).capa = capa; se traduit par buf->capa=capa;
C'est plus lisible et c'est un truc de fainéant donc forcément bien en informatique :hap:

le-fou-FURAX
le-fou-FURAX
Niveau 7
28 février 2014 à 13:43:17

Bein en fait j'aimerai bien pouvoir lui allouer juste ce qu'il faut pour stocker un nombre n de char, et pouvoir après éventuellement l'agrandir pour en stocker plus (c'est un exercice pour se familiariser avec l'allocation mémoire).

Par exemple pour stocker bonjour donc capa=7

buf = malloc(capa*sizeof(char)+sizeof(int));

7 places pour 7 chars et une place pour 1 int, ca marche comme ca oui je vais pas dans le bon sens ?

le-fou-FURAX
le-fou-FURAX
Niveau 7
28 février 2014 à 13:44:34

Parceque la même avec un malloc(1) je peux stocker autant de lettres que je veux de le tableau de char, je pige pas trop pourquoi....

dark_drow
dark_drow
Niveau 15
28 février 2014 à 14:22:26

Tu as déclaré comment ta structure?
Comment tu t'en sert ?

le-fou-FURAX
le-fou-FURAX
Niveau 7
28 février 2014 à 14:52:44

typedef struct strBuf{
char* debutchaine;
int capa;
}strBuf;

En gros j'aimerai pouvoir lui allouer asser de mémoire une chaine de caractère donnée, l'entier capa sers justement a savoir combien de char au max elle peut contenir. Après je ferais des méthodes pour lui ajouter d'autres chaines de caractère en utilisant realloc. J'aimerai en faite que sa capacité augmente ou se réduise au fur et a mesure de mes besoins mais pas moyen d'y arriver j'ai l'impression que la structure peut contenir une infinité de char même avec malloc(1) :(

Link_2408
Link_2408
Niveau 6
28 février 2014 à 15:26:38

Dans ta fonction void initBuf(), tu devra, faire :

void initBuf(strBuf* buf,int capa)
{
buf = (strBuf *)malloc(sizeof(strBuf));

buf->debutchaine= (char *)malloc(capa*sizeof(strBuf)); //Allouer ce champs

buf->capa=capa;

}

:d) le (strBuf *) avant le malloc c'est pour le caster. Parce que malloc te renvoie un pointeur de type void *, alors que toi tu veux un type strBuf * .

Après tu dois allouer le champs char* debutchaine, puis tu initialise le champs capa.

le probleme c'est que pour mettre bonjour tu devra le copier dans ta chaine après la création de la structure. Si tu veux mettre par exemple "bonjour" dés la crétion de cette structure tu devras faire ça:

void initBuf(strBuf* buf,int capa, char *ch) //ch est la chaine que tu veux mettre dans ta structure
{
buf = (strBuf *)malloc(sizeof(strBuf));

buf->debutchaine= (char *)malloc(capa*sizeof(strBuf)); //Allouer ce champs

if(capa==strlen(ch))
{
strcpy(buf->debutchaine, ch); //copie le contenu de ch dans le champs debutchaine
}

buf->capa=capa;

} //Et encore c'est pas très optimisé ^^, mais ça devrait aller.

Voilà :-)))

Par contre quand tu voudra rajouter un champs forcément tu devras le prendre en compte à chaque création.

Si tu veux avoir n structures de type strBuf* ( pour n > 1 ) tu devras mettre pour l'allocation:

buf = (strBuf *)malloc(n*sizeof(strBuf)); // en prenant soin d'avoir n en paramètre dans initBuf

Pour la libération, tu libère les champs AVANT de libérer la structure, afin d'éviter la fuite mémoire.

Voilà voilà :-)))

Si tu as d'autres questions :-)))

le-fou-FURAX
le-fou-FURAX
Niveau 7
28 février 2014 à 16:06:28

Merci de ta réponses, très précises et bien expliqué :)

J'aurais quand même quelques questions :

Tu parle de caster le pointeur, mais les tuto que j'ai vu ne parlent pas de ca, ca fais quoi concrétement ?

Aussi dans ma main j'ai fais ca :

strBuf* a;
initBuf(a,7);

seulement ca me renvoie un pointeur null pour me dire que l'allocation mémoire s'est mal passé, pourquoi ?

dark_drow
dark_drow
Niveau 15
28 février 2014 à 18:54:30

Tu parle de caster le pointeur, mais les tuto que j'ai vu ne parlent pas de ca, ca fais quoi concrétement ?

Rien en C donc le fait pas :noel:

et essaye de remplacer :
buf->debutchaine= (char *)malloc(capa*sizeof(strBuf)); //Allouer ce champs

par

buf->debutchaine= malloc(capa*sizeof(char));

dark_drow
dark_drow
Niveau 15
28 février 2014 à 18:55:31

oups double post :

car buf->debutchaine est un char* donc dans ton malloc c'est sizeof(char)

Link_2408
Link_2408
Niveau 6
28 février 2014 à 18:59:46

malloc il renvoie un type void *.

D'ailleurs dans la bibliothèque stdlib.h, tu as une déclaration de malloc qui ressemble à ça :

void * malloc(...).

void * c'est ce qu'on pourrait appeler un type générique. C'est-à-dire qu'il peut être de n'importe quel type.

malloc il connait pas le type de la variable à allouer, il connait juste la taille du type de ta variable.
Évidemment, à la fin il renvoie un pointeur, mais de type void *.

Le but du cast c'est de convertir un type en un autre type. Il est pas toujours obligatoire, dans la mesure où l'affection suffit à elle seule de forcer la conversion. En général, c'est toujours bien de caster quand on fait un malloc. Certains le font, d'autres cas. Mais au moins ça évite des problèmes.

"seulement ca me renvoie un pointeur null pour me dire que l'allocation mémoire s'est mal passé, pourquoi ? "

Quel pointeur est NULL ?? celui qui pointe sur strBuf * ou celui du champs debutchaine ?

Si c'est strBuf *, modifie ta fonction pour qu'elle renvoie un pointeur strBuf *

En gros tu dois faire ça :

strBuf * initBuf(strBuf* buf,int capa)
{
//Intructions d'allocations

return buf;
}

le-fou-FURAX
le-fou-FURAX
Niveau 7
01 mars 2014 à 04:09:10

J'aimerai bien VDD mais c'est stipulé dans l'exercice que le fonction d'initialisation doit être de type void :-(

le-fou-FURAX
le-fou-FURAX
Niveau 7
01 mars 2014 à 04:15:15

Voici ce qu'il y a dans ma main :

int main(){
strBuf* a;
initBuf(a,8);
if (a==NULL)
printf("erreur d'allocation mémoire");

Même en mettant la fonction que vous m'avez conseillé j'ai sans cesse le message "erreur d'allocation mémoire"

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware