Considérez l'extrait de code suivant :
int siz = 0; int n = 0; FILE* picture; picture = fopen("test.jpg", "r"); fseek(picture, 0, SEEK_END); siz = ftell(picture); char Sbuf[siz]; fseek(picture, 0, SEEK_SET); //Going to the beginning of the file while (!feof(picture)) { n = fread(Sbuf, sizeof(char), siz, picture); /* ... do stuff with the buffer ... */ }
Dans ce code, nous visons à lisez la taille du fichier "test.jpg" et créez un tableau Sbuf pour stocker son contenu. Cependant, la taille de Sbuf est déterminée dynamiquement, en fonction de la taille du fichier. Cela soulève la question : comment déclarer correctement siz pour que le code soit compilé avec succès ?
Malheureusement, il n'existe aucun moyen simple de créer un tableau avec un longueur variable en C. Les tableaux de longueur variable, également appelés tableaux flexibles, ne font pas partie du standard C. Par conséquent, le code présenté ci-dessus ne sera pas compilé correctement.
Il existe plusieurs solutions alternatives à ce problème, chacune avec ses propres avantages et inconvénients :
std::vector est un conteneur de bibliothèque standard en C qui fournit une structure de données dynamique de type tableau. Il alloue et réaffecte automatiquement la mémoire selon les besoins, éliminant ainsi le besoin de déclarer manuellement la taille du tableau. Le code suivant montre comment utiliser std::vector dans ce scénario :
std::vector<char> Sbuf; Sbuf.push_back(someChar);
Une autre option consiste à utiliser l'opérateur new pour allouer dynamiquement de la mémoire au tableau. Cependant, cette approche nécessite une gestion manuelle de la mémoire, augmentant ainsi le risque de fuites de mémoire. De plus, il est généralement recommandé d'utiliser std::vector plutôt que l'allocation directe de mémoire pour les tableaux dynamiques.
char* Sbuf = new char[siz]; // ... delete [] Sbuf;
Certaines bibliothèques externes, telles que la bibliothèque GNU C (glibc), prennent en charge les tableaux de longueur variable. Cependant, cette fonctionnalité n'est pas standard et peut ne pas être prise en charge sur tous les compilateurs et plates-formes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!