Quelle est la différence entre alloca (n) et char x ?

Quelle est la différence entre

void *bytes = alloca(size); 

et

 char bytes[size]; //Or to be more precise, char x[size]; void *bytes = x; 

… où taille est une variable dont la valeur est inconnue au moment de la compilation.

alloca() ne récupère pas la mémoire jusqu’à la fin de la fonction actuelle, tandis que le tableau de longueur variable récupère la mémoire à la fin du bloc actuel.

En d’autres termes:

 void foo() { size_t size = 42; if (size) { void *bytes1 = alloca(size); char bytes2[size]; } // bytes2 is deallocated here }; //bytes1 is deallocated here 

alloca() peut être pris en charge (sur un mode) sur n’importe quel compilateur C89, alors que le tableau de longueur variable nécessite un compilateur C99.

De la documentation GNU :

L’espace alloué avec alloca existe jusqu’au retour de la fonction qui le contient. L’espace pour un tableau de longueur variable est libéré dès que l’ étendue du nom du tableau se termine. (Si vous utilisez à la fois des tableaux de longueur variable et alloca dans la même fonction, la désallocation d’un tableau de longueur variable libérera également tout ce qui a été alloué plus récemment avec alloca.)

De plus, alloca n’est pas une fonction standard du C, le support n’est donc pas garanti pour tous les compilateurs. Les tableaux de longueur variable font partie de la norme C99. Par conséquent, tout compilateur prenant en charge C99 doit l’implémenter.

Outre le point mentionné par Billy, alloca est non standard (ce n’est même pas en C99).

Dans la seconde forme, la size doit être une constante connue pour comstackr le temps.

Outre les points déjà discutés sur le moment précis où l’espace est libéré, et si la construction est prise en charge, il existe également ceci:

  • Dans le cas alloca , les bytes ont un type de pointeur.
  • Dans le cas [] , bytes a un type de tableau.

La différence la plus notable est en ce que sizeof(bytes) est; pour un pointeur c’est la taille du pointeur ( sizeof(void *) ) alors que pour un tableau c’est la taille de l’espace alloué ( sizeof(char) * size , qui = size pour ce cas puisque sizeof(char) = 1 ).

(En outre, dans votre exemple, les types d’élément sont différents; pour être identique, le premier doit être remplacé par char *bytes = alloca(size) .)

La plus grande différence est que alloca n’appelle pas de constructeurs ni de destructeurs lorsque vous utilisez la mémoire en tant que variables de classe.

Les autres différences sont moins susceptibles d’être remarquées, mais peuvent apparaître dans certaines erreurs de temps d’exécution étranges dans certaines situations.