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 - memcpy() ne marche pas

Trucci
Trucci
Niveau 1
25 janvier 2018 à 19:39:44

Je ne comprends pas j'ai beau retourner cela dans tous les sens le memcpy plante...

Matiere newMatiere(char* name, double coeff) {
    Matiere* m = malloc(sizeof(Matiere) + strlen(name) + 1);
    memcpy(*m->Nom, *name, strlen(name) + 1);
    m->Coefficient = coeff;
    m->NombreNotes = 0;
    return *m;
}

Avec la struct Matiere ici:

typedef struct Matiere {

    int NombreNotes;
    double Coefficient;
    Note* Notes;
    char* Nom;

} Matiere;
TechnoForce3
TechnoForce3
Niveau 39
25 janvier 2018 à 20:16:09

À ta place je ferais plutôt un malloc de la taille de matière pour ta nouvelle matière puis un malloc de strlen de name pour le champ nom et après un strcpy de name vers le nom de matière. Aussi retourne plutôt un pointeur vers Matière qu'une copie car là tu vas jamais pouvoir la desallouer du tas

Trucci
Trucci
Niveau 1
25 janvier 2018 à 20:21:30

Ok nan c'est bon en fait mais merci beaucoups de m'avoir répondu, voici la solution:
-je ne suis pas encore une bête en C mais je progresse à grands pas: je ne savais pas que l'étoile devant un pointeur le déréférencait, et j'avais oublié de malloc le m->Nom avant le memcpy (à moins qu'il ne le fasse tout seul, jnsp je n'ai pas testé)-

Matiere newMatiere(char* name, double coeff) {
    Matiere* m = malloc(sizeof(Matiere));
    m->Nom = malloc(sizeof(name));
    memcpy(m->Nom, name, strlen(name));
    m->Coefficient = coeff;
    m->NombreNotes = 0;
    return *m;
}
TechnoForce3
TechnoForce3
Niveau 39
25 janvier 2018 à 20:38:29

Je l'avais pas vu l'étoile oui. Si tu mets '*' devant un pointeur, tu prends le contenu de l'adresse de pointeur. Sinon, je te conseille vraiment de retourner le pointeur vers ta nouvelle matière plus que de renvoyer le contenu. Quand tu fais un malloc, tu alloues la mémoire sur le tas qui nécessite un free pour être désalloué contrairement aux variables classiques dont la mémoire est libérée à la fin de la fonction. Avec la façon que tu fais actuellement, tu vas te retrouver avec de la mémoire allouée perdue car tu ne pourras pas désallouer cette mémoire à aucun moment de ton programme.

Trucci
Trucci
Niveau 1
27 janvier 2018 à 13:09:46

Merci de tes conseils.

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