Comment puis-je supprimer cette erreur de segmentation dans le programme C

Ici, je veux résoudre le problème de débordement de stack dans ce code. ici, dans ce code, j’appelle la fonction p récursivement 350000 fois, de sorte que j’ai obtenu une erreur de segmentation lorsque j’ai retiré 350000 et mis 300000 que cela fonctionne très bien ici.

cela ne fonctionne pas parce que je prends if(i != 350000) . son arrêt à peut être dans cette gamme 300000 à 327480. j’ai testé 10 fois

CODE:

 #include  void p(char *, int); int main() { char *a = "HI"; int b = 10; p(a, b); printf("\nComplete"); return 0; } void p(char *a, int b) { static long int i = 0; if (i != 350000) { printf("\n%ld \t at Hi hello", i); i++; p(a, b); } else { return; } } 

quand je vérifie ce code en utilisant l’outil Valgrind que Valgraind en signalant une erreur comme celle-ci

 ==9236== Stack overflow in thread 1: can't grow stack to 0x7fe801ff8 ==9236== ==9236== Process terminating with default action of signal 11 (SIGSEGV) ==9236== Access not within mapped region at address 0x7FE801FF8 ==9236== at 0x4EA012E: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1276) ==9236== If you believe this happened as a result of a stack ==9236== overflow in your program's main thread (unlikely but ==9236== possible), you can try to increase the size of the ==9236== main thread stack using the --main-stacksize= flag. ==9236== The main thread stack size used in this run was 8388608. ==9236== Stack overflow in thread 1: can't grow stack to 0x7fe801ff0 ==9236== ==9236== Process terminating with default action of signal 11 (SIGSEGV) ==9236== Access not within mapped region at address 0x7FE801FF0 ==9236== at 0x4A2269F: _vgnU_freeres (vg_preloaded.c:58) ==9236== If you believe this happened as a result of a stack ==9236== overflow in your program's main thread (unlikely but ==9236== possible), you can try to increase the size of the ==9236== main thread stack using the --main-stacksize= flag. ==9236== The main thread stack size used in this run was 8388608. 

S’il vous plaît, aidez-moi les gars, je veux vraiment cette solution. et je ne peux pas supprimer récursivement appel de fonction de mon code.

    Les stacks ne sont pas une ressource illimitée. La récursivité se prête bien aux algorithmes qui réduisent leur espace de recherche relativement rapidement (hachage binary d’un tableau sortingé, traversée d’arbres binarys ou à plusieurs voies, etc.).

    Si vous vous trouvez avec un algorithme qui nécessite une récursivité de trois cent cinquante mille fois, vous devriez vraiment reconsidérer l’utilisation d’une solution récursive.

    Par exemple, quelque chose comme:

     def addUnsigned (a, b): if a == 0: return b return addUnsigned (a-1, b+1) 

    n’est pas un bon match pour la récursivité.

    Si vous ne pouvez vraiment pas supprimer la récursivité, vous devez alors faire ce que valgrind suggère, changer la taille de la stack. Par exemple, l’éditeur de liaison de mon système, ld , a une option --stack qui vous permet de spécifier la taille de la stack réservée (et éventuellement --stack ).

    Avec cet exemple particulier, si vous augmentez le niveau d’optimisation de votre compilateur suffisamment haut, vous devrez éliminer les appels en bout, ce qui résoudra le problème de débordement de stack (par exemple, gcc 4.4.5 le fera à partir de -O2 et supérieur).

    Si vous voulez toujours le contrôler par programme, vous pouvez appeler votre fonction dans un thread et définir la taille de la stack pour le thread (et attendre la fin du thread).