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] Assigner valeur à structure pointée

Eauquai
Eauquai
Niveau 9
17 mars 2013 à 14:22:04

Salut :)

Voici un code. Les commentaires dans le main sont parlants :

  1. include <stdio.h>
  2. include <stdlib.h>

typedef struct
{
int entier;
} Structure;

void main()
{
/* ceci fonctionne... */
Structure s;
s.entier = 3;

/* cela pas (le programme compile mais plante)*/
Structure *s;
s->entier = 3;
}

Je me doute que la réponse doit être bête, mais je ne la trouve pas.

Merci !

PocoIo
PocoIo
Niveau 10
17 mars 2013 à 15:01:05

Tu n'a manifestement pas bien compris la façon dont marche les pointeurs.

Un pointeur contient une adresse, hors là tu n'a pas initialisé ton pointeur s. C'est comme si tu écrivais "int n", la valeur de n ne serait pas définie, ici c'est pareil, ton pointeur s contient une adresse non définie et pointe on ne sait trop où mais certainement pas sur une struct de type Structure en tout cas.

Donc soit tu assignes au pointeur l'adresse d'une Structure déjà existante, par exemple:

Structure s;
Structure *p = &s;
p->entier = 3;

Ou alors tu utilises malloc pour allouer un bloc de mémoire de la taille d'une Structure et tu récupères l'adresse retournée par malloc (qui est l'adresse du bloc de mémoire qui a été alloué), exemple:

Structure *p = malloc(sizeof(Structure));
p->entier = 3;
free(p);

Si tu utilises malloc il faut que tu libères toi-même l'adresse allouée via l'appel de malloc avec free sinon il y aune fuite de mémoire, bref je vais pas rentrer dans les détails, je te laisse le soin d'étudier ça plus en profondeur.

Eauquai
Eauquai
Niveau 9
17 mars 2013 à 15:45:38

Je savais que je n'initialisais pas ma structure, mais après l'avoir déclarée, je pensais qu'une zone de la taille nécessaire (nombre de bytes pour contenir ma structure) avait été allouée, sans pour autant qu'il ait été assigné de valeur à ces cases mémoires ! En donnant l'instruction "s->entier = 3" je pensais que je demandais simplement d'assigner la valeur 3 à la case mémoire destinée à l'attribut "entier" de "s", peu importe qu'elle soit assignée au préalable ou pas !

Donc en fait là où je me trompais, c'est que en fait :
Structure s; => alloue pour moi l'espace nécessaire pour contenir une "Structure"
Structure *s; => alloue pour moi l'espace nécessaire pour contenir une adresse quelconque.

DN4
DN4
Niveau 7
18 mars 2013 à 00:04:49

Dans l'idée et en simplifié, c'est bien ça.

Si tu veux en savoir davantage, je te conseille fortement de te renseigner sur ce qu'est la stack (pile) et le heap (tas) pour comprendre ce qui se passe en coulisses. :)

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