Allocation mémoire statique / dynamique
Bonjour,
Pour allouer un tableau en C, est-il faux d'écrire dans une méthode la ligne suivante :
uint8_t buffer[STREAMBUFFERSIZE + lenBackupBuffer + 1];
sachant que STREAMBUFFERSIZE est une constante et que lenBackupBuffer peut varier, je me demande si c'est syntaxiquement correct.
En fait j'utilise la méthode read:maxLength de NSInputStream qui me retourne les données dans un tableau de type uint8_t. Parfois la ligne qui m'est retournée n'est pas complète et je suis obligé de stocker une partie dans un autre buffer, de refaire une lecture sur le flux et de concaténer la nouvelle lecture avec les données lues précédemment. J'utilise actuellement des malloc pour allouer mon tableau buffer mais je demandais si la ligne de code ci-dessus était correcte et ce qu'allait faire le compilateur.
Merci.
Réponses
-
Il n'a pas toujours été possible de faire ce genre de choses, il semble qu'il faille un compilo à la norme C99.
Personnellement, je passe par des structures C (avec malloc et free par conséquent dans les constructeurs et destructeurs) dans lesquelles je mets par exemple des tableaux.
Cela permet en particulier à des classes C++ (comme pour l'audio) et Objectiv-C de communiquer.
1) En C standard*, les variables locales sont allouées sur la pile, or la pile a une taille limitée. Je ne la connais pas précisément sous Mac OS 10.8, mais c'est de l'ordre de 64 ko. Donc, on ne peut pas réserver 1 Mo en écrivant ça:
char buffer[1024*1024];
On peut l'écrire, mais ça va planter à l'exécution.
C'est pour cela qu'on doit faire de l'allocation dynamique.
2) En C standard*, la taille d'un tableau doit être déterminable par le compilateur. Ce n'est pas le cas dans l'exemple donné.
3) Pour régler ton problème, jette un oe“il à la fonction realloc()
*Quand je dis C standard, je parle du C ANSI, la norme de 1985. Il est effectivement possible qu'il y ait eu des changements dans le norme C99 que je ne connais pas.
Dans ce document http://developer.apple.com/library/mac/#qa/qa1419/_index.html
il est dit que la taille standard de la pile est 8 Mo, extensible à 64 Mo.
Pour les threads secondaires, c'est 512 Ko par défaut, extensible à 1 Go !
Ouaouh, 8 Mo!
Je suis quasiment sûr que c'était 32 Ko sous 10.0.
Faites des algos recursifs !
Merci pour le lien, j'ai été trop fainéant pour chercher moi-même ;-)