débordement de stack c ++

Donc, j’essaie de résoudre une tâche. déjà du code, mais des sorties système, “stack overflow”, je suis nouveau en c ++ et mon anglais n’est pas bon, je suis désolé pour un malentendu =)

#include  using namespace std; int main (){ int n; int x; int k = 0; // счетчик для рабочего массива int a [200000]; scanf("%d\n",&n); for (int i = 0; i> x; if (x > 0){ k++; a[k] = x; }else if(x == 0){ for (int q = 1; q <= k; ++q){ // копирование a[k+q] = a[q]; } k *= 2; }else{ printf("%d %d\n",a[k],k); k--; } } system("pause"); } 

ressemble à l’algorithme fonctionne correctement, mais le seul problème est la stack. Merci beaucoup!

Cause première:

Comme vous l’avez bien compris, la stack est limitée et il semble que votre allocation soit suffisamment importante pour pouvoir être traitée à travers elle. Ce n’est pas une erreur de syntaxe de langage, donc cela ne garantit pas une erreur de compilation, mais il en résulte une exception d’exécution provoquant ainsi un crash.

Solution 1:

Vous pouvez rendre le tableau global, l’allocation d’un tableau global n’étant pas sur la stack, cela devrait donc fonctionner correctement pour vous:

 int a [200000]; int main() { ..... } 

Solution 2:

Vous pouvez utiliser un std::vector

Solution 3:

Vous pouvez utiliser l’allocation dynamic via new .

Déclaration int a [200000]; tente d’allouer plus de mémoire sur la stack qu’il ne convient, ce qui a provoqué un débordement de la stack. Certaines personnes recommandent que les tableaux de plus de quelques kilo-octets soient alloués dynamicment plutôt que comme une variable locale. Veuillez vous référer à wikipedia: http://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables

3 changements que je peux voir.
1 – Allouer sur la stack plus que la stack ne peut en gérer.
2 – k devrait toujours pointer vers le prochain espace libre, vous devez donc mettre à jour plutôt que l’augmenter.
3 – les index commencent à “0” tous les deux pour le “q” pour.

Code fixe:

 #include  using namespace std; int a [200000]; int main (){ int n; int x; int k = 0; // счетчик для рабочего массива scanf("%d\n",&n); for (int i = 0; i< n; ++i){ std::cin >> x; if (x > 0) { a[k] = x; k++; //<< change 1 } else if (x == 0) { for (int q = 0; q <= k; ++q) //<