Question
Pourquoi ce code génère-t-il un SIGSEGV :
int main()
{
unsigned long toshuffle[9765625];
unsigned long i;
for (i=0; i< 1000; i++)
toshuffle[i]= i;
return 0;
}
Les pointeurs seront appréciés. (No Pun prévu:))
La solution
Utilisez malloc () pour obtenir autant de mémoire. Vous débordez la pile.
unsigned long *toshuffle = malloc(9765625 * sizeof(unsigned long));
Bien sûr, quand vous en aurez fini, vous devrez le libérer ().
REMARQUE: en C ++, vous devez convertir le pointeur sur le type approprié.
Autres conseils
Probablement parce que vous ne pouvez pas allouer 9765625 longs sur pile (comment ce site s'appelle-t-il encore? :)). Utilisez malloc ()
à la place.
Extrait de la page de manuel
- RLIMIT_STACK
La taille maximale de la pile de processus, en octets. Lorsque cette limite est atteinte, un signal SIGSEGV est généré. Pour traiter ce signal, un processus doit employer une pile de signaux alternative ( sigaltstack ). ).