Bonjour à tous,

J'écris un programme C++ qui accède à des données d'un logiciel propriétaire via une api C.
J'utilise des fonctions de l'api de la forme suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
int GetData(blabla, int type_data, api_struct *return_data);
Je choisi la donnée que je souhaite récupérer avec la variable type_data.
Je fourni un pointeur de type api_struct qui recevra dans l'union data la donnée souhaitée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
typedef struct _api_struct
{
    int type_data; /* Key indicating type of information */
    union
    {
	int data1;
	char *data2;
	time_t data3;
	int data4;
	char *data5;
    } data;
} api_struct;
La fonction de l'api renseigne le pointeur fourni.

L'accès se fait donc de la façon suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
    api_struct *list_data;
    GetData(blabla, type_data2, list_data);
    ma_fonction_locale(list_data->data.data2);
A la compilation j'ai le warning suivant :

133: warning: 'list_data' is used uninitialized in this function

Pourtant la documentation de l'api dit que la mémoire pointée par le pointeur retourné par la fonction est gérée par l'api.

A l'exécution j'ai l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Process returned -1073741819 (0xC0000005)   execution time : 6.750 s
Alors j'ai effectué la modification suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
api_struct list_data[1000];
GetData(blabla, type_data2, list_data);
ma_fonction_locale(list_data->data.data2);
et même

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
api_struct list_data[0];
GetData(blabla, type_data2, list_data);
ma_fonction_locale(list_data->data.data2);
Et ça marche. Mais si j'appelle la fonction plus d'une demi-douzaine de fois j'ai l'erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
"La mémoire ne peut être read".
Qu'est-ce que j'ai loupé ?