Segmentation fault

Segmentation fault
0

Witam, mam problem z takim oto programem:

Kopiuj
int main()
{
     unsigned int tab[10000001];
     int i = 0;
}

Kompiluje się on bez błędu, ale nie chce się wykonać - na Windowsie wykonanie przerywa się bez komentarza, na Linuxie mówi "segmentation fault (core dumped)". Co ciekawe, gdy nie próbuję przypisać zmiennej i wartości 0 (ale deklaruję tę zmienną), program wykonuje się bez błędu. Może mi ktoś powiedzieć, z czego wynika takie zachowanie i jak sobie z nim poradzić?

Używam Windows 7 + MinGW oraz Ubuntu 14.04 LTS + GCC, architektura 64bit

Asmal
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Olsztyn
0

Jeśli chcesz taką tablice to zrób ją dynamicznie. Teoretycznie powinna działać.

Kopiuj
 
int * tablica = new int[ 10000001 ];
//tu używasz normalnie tablice
delete [] tablica; // po zakończeniu zabawy usuwasz ją 
edytowany 1x, ostatnio: Asmal
kq
tag jest c, poza tym, dla C++ użycie new i delete to anty-rada.
Asmal
Znowu mój fail XD Dlaczego odradzasz używanie new i delete?
kq
Ponieważ używanie ich implikuje użycie nagich wskaźników do przekazania informacji o własności. Stosunkowo ciężko jest napisać kod używający nagich wskaźników, który nie będzie powodował wycieków pamięci, szczególnie jeśli weźmiesz pod uwagę jego refaktoring (dodasz wyjście z funkcji w środku - wyciek, a wyjście z funkcji to nie musi być return, tylko np. funkcja mogąca rzucić wyjątek). Używając RAII unikasz takich problemów, dlatego w nowoczesnym C++ użycie new i w szczególności delete to powinna być rzadkość z dobrze udokumentowanym powodem.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:6 minut
  • Lokalizacja:Szczecin
2

Dla sizeof(int) == 4 ta tablica zajmuje 40MB. Nic dziwnego, że nie mieści się na stosie, który z reguły ma ok 1-2MB i musi wystarczyć dla wszystkich funkcji w danym wątku.

Powinieneś użyć malloc do alokacji dynamicznej.


DR
  • Rejestracja:około 12 lat
  • Ostatnio:około 17 godzin
  • Postów:1131
0

Z tego co mi się wydaje jest tez jakaś biblioteka pozwalająca takie liczby używać.

fasadin
:DDD?
DR
Ok to bylo glupie:P teraz do mnie dotarło. Ta biblioteka musi byc od czegos innego. Jak wrócę do domu to aż z ciekawości sprawdzę
fasadin
bibloteka od duzych liczb. To jest zupelnie cos innego. Jezeli robisz operacje na bilionach to wtedy sie przydaje
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:6 minut
  • Lokalizacja:Szczecin
0

Biblioteka za dużo nie pomoże, musiałbyś zwiększyć rozmiar stosu (o ile dobrze pamiętam - przy kompilacji na Windowsie i przed uruchomieniem na Linuksie), tylko po co?


DR
  • Rejestracja:około 12 lat
  • Ostatnio:około 17 godzin
  • Postów:1131
0

Chyba się pomyliłem. Nie mam teraz dostępu do kompa. Wiec znalazłem tylko to http://stackoverflow.com/questions/3771154/how-to-declare-and-use-huge-arrays-of-1-billion-integers-in-c i jednak chyba nie ma innej drogi:P

fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

raz to ta liczba ktora podal zmiescilaby sie bez problemu w zmiennej
a druga rzecz to kompletnie nie chodzi o liczby (ich wielkosc)...

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:8 dni
0

Można jeszcze tak:

Kopiuj
int main()
  {
   static unsigned int tab[10000001];
   int i=0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.