IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Libération d'un char* passé en paramètre d'un TTF_RenderText_Solid [SDL 1.2]


Sujet :

SDL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Libération d'un char* passé en paramètre d'un TTF_RenderText_Solid
    Salut à tous,
    Je réalise actuellement un projet avec SDL, et j'ai remarqué une erreur assez troublante dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    void affichage_win(SDL_Surface *ecran,int num_j){
            char *win=malloc(sizeof(win));
            SDL_Surface *texte_win;
            SDL_Color couleurTexte={0,0,0,0};
            SDL_Rect pos_win;
     
            pos_win.x=LARGEUR/3;
            pos_win.y=HAUTEUR/3;
            TTF_Font *police=TTF_OpenFont("arial.ttf",40);
     
            //joueur 1
            if(num_j==0)
               win=strcpy(win,"VICTOIRE JOUEUR 1!!");
     
          //joueur 2
            if(num_j==1)
               win=strcpy(win,"VICTOIRE JOUEUR 2!!");
     
     
            texte_win=TTF_RenderText_Solid(police,win,couleurTexte);
            SDL_BlitSurface(texte_win,NULL,ecran,&pos_win);
            SDL_Flip(ecran);
            SDL_FreeSurface(texte_win);
            free(win);
    }
    En fait ici je ne peux pas free(win), sinon segfault, il me dit que j'essaye de free quelque chose qui n'existe pas...
    Si je le met pas ça marche...
    Est ce que les fonctions SDL se chargent elles-même de la libération mémoire de ce char* ou est ce que - pour une raison ou pour une autre - je n'ai pas le droit de le libérer à ce moment là?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Ryzen
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *win=malloc(sizeof(win));
    Ceci n'alloue de la mémoire que pour la taille d'un pointeur sur char : sizeof(char *).

    Une première écriture plus correcte serait déjà char *win = malloc(sizeof *win); ou char *win = malloc(sizeof(char)); pour allouer la place pour un caractère... mais il faut aussi prendre en compte ce que tu y mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    win=strcpy(win,"VICTOIRE JOUEUR 1!!");
    Ici tu copies strlen("VICTOIRE JOUEUR 1!!") + 1 = 20 caractères à partir cette adresse fraichement allouée. Autant dire que tu dépasses la capacité allouée.

    char *win = malloc(20 * sizeof *win); ou char *win = malloc(20 * sizeof(char));.

    Remarque : par sécurité, pense à vérifier les retours des différentes fonctions que tu utilises.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 20/03/2013, 07h32
  2. Réponses: 3
    Dernier message: 01/02/2006, 21h31
  3. [SQL server 2000] bout de requete passé en paramètre
    Par guignol dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/08/2004, 17h45
  4. Réponses: 6
    Dernier message: 28/05/2004, 09h39
  5. Réponses: 5
    Dernier message: 27/11/2003, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo