Vous pouvez les empêcher de se bloquer en ne les utilisant pas. :)
Sérieusement, il n'y a presque aucun moyen sûr d'utiliser des tableaux de longueur variable pour vous rendre la vie plus facile, sauf si vous avez des limites fortes sur la taille. D'autre part, vous pouvez les utiliser sous condition, de manière à ceci:
char vla_buf[n < 1000 ? n : 1];
char *buf = sizeof vla_buf < n ? malloc(n) : vla_buf;
if (!buf) goto error;
/* ... Do stuff with buf ... */
if (buf != vla_buf) free(buf);
Bien que cela ressemble à la douleur inutile, il peut faire une énorme différence de performances, en particulier dans les applications threadées où de nombreux appels à malloc
et free
pourrait entraîner un conflit de verrouillage. (Un autre avantage notable de cette astuce est que vous pouvez soutenir les anciens compilateurs sans VLA en remplaçant simplement [n < 1000 ? n : 1]
avec 1000
, par exemple avec une macro.)
Un autre cas obscur où VLA peut être utile est dans les algorithmes récursifs où vous connaissez les Le nombre total d'entrées de tableau requises pour tous les niveaux de récursivité est limité par n
, où n
est suffisamment petit pour que vous soyez certain qu'il ne débordera pas la pile, mais où il peut y avoir jusqu'à n
niveaux de récursivité et niveaux individuels qui sont épuisés à n
éléments. Avant C99, la seule façon de gérer ce cas sans prendre l'espace de pile n^2
était d'utiliser malloc
. Avec les VLA, vous pouvez résoudre entièrement le problème sur la pile. Gardez à l'esprit, ces cas où les VLA sont vraiment bénéfiques sont assez rares. Normalement, VLA est juste un moyen de vous tromper que la gestion de la mémoire est facile, jusqu'à ce que vous soyez un peu par les vulnérabilités qui en résultent (trivial-à-exploiter) que vous avez créé.:-)
Edit: Pour mieux répondre question originale OP:
#define MAX_VLA 10000
int bar(size_t n)
{
int arr[n <= MAX_VLA ? n : 1];
if (sizeof arr/sizeof *arr < n) return ENOMEM;
/* ... */
return 0;
}
Votre limite peut (dépend du système, bien sûr) pas être "mémoire" mais "taille de la pile". Et maintenant la question a plus de sens pour moi parce que je pensais à votre "avant" la mise en œuvre sur une boîte de consommation raisonnablement moderne et je me demandais * "Que fait-il qu'il a besoin d'une grande partie d'un GB?" En tous cas. Si la pile vous limite, le "vieux" peut être meilleur. – dmckee
C'est exactement la raison pour laquelle les VLA ne sont pas beaucoup utilisés (un autre étant un support médiocre dans les compilateurs). Les VLA C99 ne sont tout simplement pas stables. – VSG24