Vérification de la taille allouée et bonnes pratiques
Bonjour,
Dans l'exemple ci-dessous, je cherche à remplir un tableau à partir des données binaires lues dans un fichier (binaire).
Code:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #define C_NB_MAX_ELEM 10
#define NOMFICHIERSOURCE "Exemple.bin"
#include <stdlib.h>
#include <string.h>
//Pour l'exemple
typedef int32_t Element_t;
//Exemple de programme remplissant des tableaux
in32_t main( void )
{
Element_t TableauExemple[C_NB_MAX_ELEM]:
size_t NbElemLus = 0;
NbElementLus = importBinaireElement( NOMFICHIER, TableauExemple );
return EXIT_SUCCESS
}
size_t importBinaireElement( char_t * p_NomFichier, Element_t * p_TableauARemplir )
{
FILE * p_fichierBinaire = NULL; //Tant que le fichier n'est pas ouvert, on met une adresse invalide
size_t NombreElemLus = 0;
//Verifier que l'epace memoire est disponible
if( p_TableauARemplir != NULL )
{
/*
Cette fonction remplit la table p_TableauARemplir de 0. Cette table comporte C_NB_MAX_ELEM elements de taille "sizeof(Element_t)" octets.
*/
//Ouverture du fichier binaire
/*
Le fichier est ouvert en lecture ('r') et en mode binaire ('b').
*/
p_fichierBinaire = fopen(p_NomFichier, "rb");
//Si l'ouverture du fichier a reussi, la variable p_fichierBinaire contient une valeur valide
if (p_fichierBinaire != NULL)
{
/*
Cette fonction lit au plus C_NB_MAX_ELEM elements, chacun de taille "sizeof(Element_t)" octets, depuis le fichier accede au travers de p_fichierBinaire.
Les elements sont ranges dans p_TableauARemplir. La fonction retourne le nombre d'elements vraiments lus.
*/
NombreElemLus = fread(p_TableauARemplir, sizeof(Element_t), C_NB_MAX_ELEM, p_fichierBinaire);
// La lecture etant terminee, on ferme le fichier et affectons a nouveau une valeur invalide a p_fichierBinaire
fclose(p_fichierBinaire);
p_fichierBinaire = NULL;
}
}
//Retourner le nombre d'elements importes
return NombreElemLus;
} |
Ce programme doit être statique. Je définis donc une taille maximum pour le tableau que je souhaite remplir : elle est égale au nombre maximum d'éléments que pourrait contenir le tableau.
La ligne suivante a pour but de controler que le tableau où seront rangées au plus C_NB_MAX_ELEM données est suffisamment alloué en mémoire.
Code:
if( p_TableauARemplir != NULL )
Malheureusement, je ne sais pas comment vérifier la quantité de mémoire allouée à partir d'une adresse. Ici, je voudrais vérifier que p_TableauARemplir est l'adresse du premier byte d'une zone mémoire à laquelle qu'au moins C_NB_MAX_ELEM*sizeof(Element_t) bytes auront été alloués. Est-ce possible. Pourriez-vous m'aider ?
Dans cet exemple, ce n'est peut-être pas necessaire, mais la fonction importBinaireElement pourrait être utilisée dans des circonstances moins favorables.
Merci d'avance.