2009-08-11 9 views
2

Je veux déclarer un tableau: int a [256] [256] [256] Et le programme se bloquer. (Je commente déjà tous les autres codes ...) Lorsque j'essaie int [256] [256], ça fonctionne bien. J'utilise le compilateur C++ MingW, Eclipse CDT. Mon code est: int main() { int a [256] [256] [256]; return 0; }tableau multidimensionnel en C++ hang

Tout commentaire est le bienvenu.

+0

Que voulez-vous dire par "commenter tous les autres codes"? Voulez-vous dire qu'un programme constitué d'une seule ligne, 'int a [256] [256] [256]', et une méthode principale vide 'int main() {}', se bloque? –

+0

Le code réel est le bienvenu. – Alex

+5

256 * 256 * 256 est de 16 millions d'éléments; votre tableau est de 64 mégaoctets sur un système 32 bits. Pas déraisonnable pour les systèmes modernes, mais si vous allouez sur la pile (à l'intérieur d'une fonction), c'est probablement plus gros que ce que votre compilateur et votre système d'exploitation attendent. –

Répondre

10

Cela peut arriver si votre tableau est local à une fonction. Dans ce cas, vous aurez besoin d'une taille de pile suffisante pour contenir 2^24 ints (2^26 octets, ou 64 Mo).

Si vous définissez un tableau global, cela devrait fonctionner. Je ne suis pas sûr de savoir comment modifier la taille de la pile dans Windows; sous Linux, vous utiliseriez "ulimit -s 10000" (les unités sont KB).

Si vous avez une bonne raison de ne pas utiliser de global (concurrence ou récursivité), vous pouvez utiliser malloc/free. L'important est soit d'augmenter votre pile (ce qui n'est pas une bonne idée si vous utilisez des threads), soit d'obtenir les données sur le tas (malloc/free) ou le segment de données statiques (global).

Idéalement, vous obtiendrez une terminaison de programme (core dump) et non un blocage. Je fais en cygwin.

+0

+1, battez-moi! Utiliser malloc ou new [] pour allouer la mémoire à partir du tas réglerait également le problème, si c'est bien le problème. –

+0

Tenter de manger 64 Mo de pile est probablement un problème, en effet, +1. –

0

Peut-être que vous n'avez pas 16 Mo de mémoire continue libre? Difficile à imaginer mais possible ...

+0

@bkritzer: 64MB; les nombres sont de 4 octets. 8-) – RichieHindle

+0

Oups, ne faisait pas attention à la partie "int". – bkritzer

0

Vous voulez quelque chose comme ça

#include <malloc.h> 
int main() 
{ 
    int *a; 
    a = (int*)malloc(256*256*256*sizeof(int)); // allocate array space in heap 
    return 0; 
} 

Sinon, vous obtenez quelque chose comme ceci:

alt text http://bweaver.net/files/stackoverflow1.jpg

Parce que, comme d'autres l'ont souligné, dans votre code que vous l'allocation du tableau sur la pile, et l'exploser.

Allouer le tableau via malloc ou ses amis est la solution. (Le créer globalement fonctionne aussi, si vous devez suivre cette route.)

Questions connexes