2011-10-31 3 views
2

En Objective-C, je déclare un tableau C comme ceci:Déclaration de tableau basée sur une pile en Objective-C?

longueur int = 10;
int a [longueur];

Cela ne provoque pas d'erreurs dans Xcode mais d'autres compléments tels que Visual Studio. S'il vous plaît dites-moi comment cela fonctionne. Dois-je l'utiliser ou utiliser malloc/calloc à la place?

Répondre

6

Des matrices de longueurs variables ont été introduites dans C99. Le compilateur actuel de Microsoft (VC2010) ne prend pas en charge C99 (ou au moins la partie VLA de celui-ci) autant que je sache.

Vous pouvez utiliser malloc pour faire le même genre de chose, il vous suffit de se rappeler de free quand vous avez terminé.

Quelque chose comme:

int length = 10; 
int *a = malloc (length * sizeof(int)); 
if (a == NULL) { 
    doSomethingIntelligentSinceNoMemoryLeft(); 
} else { 
    useToHeartsContent (a[0], "thru", a[9]); 
    free (a); 
} 

Vous pouvez probablement utiliser aussi alloca qui est similaire à Vlas qu'il alloue de l'espace sur la pile pour les variables blocs de mémoire. Vous devez être careful. Alors que alloca vous donne une désaffectation automatique à la sortie de la fonction, la pile est généralement une ressource plus petite que le tas malloc et, si vous utilisez le tas, elle vous renvoie NULL. Si vous expulsez votre pile, cela se manifestera probablement comme un crash.

alloca(n) est probablement acceptable pour des valeurs suffisamment petites de n.

+1

Vous pouvez également utiliser 'alloca()' pour effectuer des allocations basées sur une pile avec une taille dynamique. –

+0

@Kevin: oui, cela fonctionnera jusqu'à un certain point, alors vous allez vous planter gravement quand vous soufflez la pile :-) Bien que ce soit probablement aussi le cas avec les VLAs. – paxdiablo

+0

Bien expliqué. Merci paxdiablo. – roboleo

Questions connexes