Bonjour,
Je suis en train de faire petit programme en C utilisant le libusb pour communiquer avec mon téléphone Android. J'ai voulu faire une fonction pour convertir un code d'erreur en chaîne de caractère, et n'ayant pas fait de C depuis longtemps (je suis plutôt dans Java et C++ ces derniers temps), j'ai fait des trucs pas beaux avec des chaînes de caractères.
J'ai fait une fonction qui en gros ressemblait à ça :
Ça marchait très bien dans la fonction appelante (pour obtenir la chaîne et l'afficher). J'ai ensuite voulu rajouter un free puisque dans cette fonction appelante puisque j'avais fait un malloc. Ca c'est fini en bon gros crash (l'opérateur = avec les chaînes en C...
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 char* libusbErrorTranslate(const int errorNumber) { char* errorMessage = (char*)malloc(100*sizeof(char)); if(NULL==errorMessage) { puts("*** Impossible d'allouer l'espace memoire pour stocker le message d'erreur de la libusb !"); perror("*** Errno "); } switch(errorNumber) { case 0 : errorMessage="LIBUSB_SUCCESS"; // plusieurs autres cases... default : errorMessage="(NONE)"; } return errorMessage; }), la zone pointée n'étant plus celle allouée avec malloc ,et j'ai modifié comme suit pour que ça marche :
J'ai du coup parcouru la FAQ de Developpez et je suis tombé sur cet entrée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 strncpy (errorMessage, "(NONE)", 100); *(errorMessage+99)='\n';
Je me suis alors posé des questions bêtes :
- quel est l'intérêt de ce genre de variable ?
- quand est libérée la mémoire ?
- si je change la valeur (4e ligne dans l'exemple de la FAQ), que devient l'espace mémoire de la précédente chaîne ?
- peut-on retourner ce pointeur avec une fonction ?
- est ce que l'affectation peut planter en cours d'exécution (si pas de mémoire disponible) et comment cela se passe ?
Mes réponses sont :
- ne pas avoir à se soucier de la taille à allouer
- (pas d'idée...)
- à la fin du bloc où la variable a été déclarée
- non si la variable est définie dans cette fonction
- (pas d'idée... plantage brutal ?)
Bref, si certains connaissent bien le comportement de ces choses, je les remercie d'avance d'éclairer ma lanterne![]()
Partager