erreur d’exécution (débordement de stack)

J’ai ce code en langage C:

char *options[100000]; int k[100000]; char *param[100000]; int n; int i,j; ... scanf("%d",&n); for (i=0;i<n;i++) { scanf("%s%d",&options[i],&k[i]); param[i]="On"; } ... 

juste au moment où le programme atteint ce point:

 scanf("%s%d",&options[i],&k[i]); 

Je reçois l’erreur d’exécution (débordement de stack). L’entrée ici devrait être comme ceci:

 word1 number1 word2 number2 

etc. Je ne sais pas pourquoi cela se passe. Quel est le problème?

Ok … alors je pensais que quelqu’un apporterait une réponse à votre problème de débordement de stack, mais jusqu’à présent, tout le monde n’a fait que mentionner un problème que vous avez réellement (plus à ce sujet plus loin) et qui n’est pas lié au débordement de stack (ce sera problématique vous corrigez cela en premier).

 ----------------- | Your stack | | (grows down) | | | ----------------- | | | | | | | | | | | | -- max stack size is here | | | | | | | | | | ----------------- | Your heap | | (grows up) | | | ----------------- 

Et puis vous essayez d’allouer un tas de très grands tableaux et de manquer d’espace

 ----------------- | Your stack | | (grows down) | | | | | | | | | | | | | | | | | -- max stack size is here | | ----------------- -- what you actually need | | | | | | | | ----------------- | Your heap | | (grows up) | | | ----------------- 

Vous obtenez donc une erreur d’exécution (débordement de stack) car vous avez essayé d’utiliser plus d’espace de stack que celui dont vous disposez.

Le truc ici consiste à utiliser l’allocation de tas (car sur la plupart des plates-formes, du moins toutes celles dont j’ai entendu parler), le tas est massivement plus grand que la stack.

Pour allouer de la mémoire sur le tas, utilisez malloc (également, quand vous en aurez fini, n’oubliez pas de libérer la mémoire en utilisant free , sinon vous perdrez de la mémoire).

EDIT: Bonus: L’autre problème que vous avez. D’autres réponses semblent indiquer que vous accédez / déréférencez / utilisez de la mémoire non allouée. En fait, vous êtes partiellement d’accord sur ce point.

Vous numérisez un point d’appel vers un tableau de caractères (voici le problème) et un int dans le tableau k (pas de problème. C’est pourquoi à présent, toutes les entrées du tableau d’options pointent vers nulle part / n’importe où. Vous devez allouer de la mémoire malloc ).

Quant à strdup, il alloue la mémoire elle-même et renvoie le pointeur, encore une fois, pas de problème. N’oubliez pas de le libérer une fois que vous l’utilisez, car il s’agirait encore d’une fuite de mémoire.

char * options [100000] alloue 100 000 pointeurs de chaîne, pas de chaînes. scanf est en train de passer du charabia.