2010-05-03 19 views

Répondre

4

Non. En raison de sa nature, free() a besoin de la liberté d'écrire dans la mémoire donnée, de faire de la "comptabilité". C'est pourquoi il est défini pour prendre un pointeur non const.

Comme d'autres l'ont fait remarquer, cela ne signifie pas qu'il ne peut pas fonctionner; C peut supprimer la valeur const d'un pointeur et laisser la fonction s'exécuter comme si elle était appelée sans const. Le compilateur avertira quand cela arrivera, c'est pourquoi je le considère comme "causant des problèmes".

+0

J'ai la même structure 'struct Account { \t const char * strLastName; // Nom du client \t const char * strFirstName; // Prénom du client \t int nID; // ID du client \t int nLignes; // Nombre de lignes liées au compte \t double lastBill; // La dernière facture du client pour toutes les lignes \t Liste linesDataBase; }; ' J'utilise malloc pour créer puis essayer de libérer la mémoire de prénom et nom de sorte que je reçois de l'avertissement du compilateur – lego69

+0

J'ai essayé cela par la mémoire malloc pour un const char *. Il y avait des avertissements, mais tout a bien fonctionné. Pourquoi? – Jay

+1

Si le pointeur transmis à free est valide pour être libéré (c'est-à-dire qu'il a été renvoyé à partir d'un appel à 'malloc' ou à une fonction connexe) alors toute zone de tenue de livres spéciale doit être accessible en écriture. Si la valeur de retour 'malloc' a été transtypée (depuis' void * ') vers un' const char * 'alors tant qu'un prototype valide pour' free' est dans la portée, alors l'appel de la fonction retournera la bonne conversion à 'void * 'et l'appel est valide. –

1

Si le pointeur a été alloué oui. Vous recevrez un avertissement, mais vous en avez déjà un lorsque vous l'avez attribué.

J'utilise souvent const char * dans mes structures quand je veux m'assurer que personne n'écrit dedans entre l'allocation et la libération. Il est souvent le cas que vous créez dynamiquement une chaîne qui est immuable pour sa durée de vie et si vous l'appelez avec une fonction avec des effets secondaires (strtok), vous pouvez avoir des problèmes. En le déclarant const vous pouvez au moins être averti dans ce cas.

const char *msg; 

asprintf((char *)&msg, "whatever" ...); 
... 
strtok(msg, ",");  // Will generate a warning 
... 
free((char*)msg);