2010-06-16 9 views

Odpowiedz

21

Po pierwsze, to dwa miliardy. Jeśli masz 32-bitową przestrzeń adresową i int ma rozmiar czterech bajtów na platformie (typowej dla platformy 32-bitowej), nie możesz przechowywać tej liczby całkowitej, kropka.

Nawet wciąż masz do dyspozycji tylko tyle miejsca na stosie, w którym znajdują się zmienne automatyczne.

Jeśli potrzebujesz naprawdę dużej tablicy, powinieneś ją przydzielić za pomocą klawiatury numerycznej malloc() (a jeśli to zrobisz, pamiętaj, aby zwolnić ją przy użyciu free(), gdy skończysz!).

+0

Nawet jeśli tak nie było, 2000000000 * 4 = 8 000 000 000 bajtów na platformie 32-bitowej. To prawie 2^33, czyli więcej niż dostępna pamięć. –

+0

@Chris: Tak - właściwie nie liczyłem zer, dopóki nie napisałem. To dużo liczb całkowitych! –

+0

Zazwyczaj można przydzielić bardzo duże tablice z czasem przechowywania statycznego. – caf

4
int nums_size = 2000000000; 

int nums[nums_size]; 

Nie znaczy 2000000000 bajtów wskazówki, oznacza to 2000000000 elementów typu int, które na platformie 32-bitowej oznacza, że ​​jesteś zużywa prawie 8GB pamięci - jest to niemożliwe.

+0

... i na stosie!- Kaboom! –

3

Przydzielasz gigantyczną tablicę na stosie. Praktycznie żaden kompilator C/C++ nie poradzi sobie z tym poprawnie.

Możesz być w stanie uciec z przeniesieniem go do globali (które przydzieli statycznie przestrzeń przez mapowanie pamięci w pliku wykonywalnym w czasie kompilacji) lub przełączając się na tablicę d o wartości malloc.

Oczywiście wciąż jest to dużo pamięci, o którą można poprosić za jednym zamachem, ale przynajmniej te metody, o których wspominałem, pozwolą uniknąć natychmiastowego uszkodzenia na .

+1

Kompilator poradzi sobie z tym poprawnie (jeśli był w rozmiarze 2^32), ale system operacyjny nie pozwoli, aby stos był tak duży. –

+0

nie tylko C/C++, prawie każdy język, który przydziela na podstawie stosu (tj. Prawie wszystkie z nich) – Spudd86

0

Ta wersja działa poprawnie na moim komputerze:

const int nums_size = 2000000000; 
int nums[nums_size]; 

int main() 
{ 
    int i; 
    for(i = 0; i < nums_size; i++) { 
     nums[i] = i; 
    } 

    return 0; 
} 

(Cóż, bądźmy szczerze mówiąc rozpoczyna grzywny, ale wkrótce idzie do wymiany.).

+0

Zgaduję, że twoja wersja działa na platformie 64-bitowej. Z jego 2^31 komentarza zdecydowanie nie korzysta z 64-bitowego systemu operacyjnego. –

+0

-1 za więcej pamięci niż ja (tylko żartuję). – cdonner

+0

@Chris Komentarz 2^31 nie mówi, czy używasz wersji 32-bitowej czy 64-bitowej. Myślę, że gcc domyślnie obsługuje 32-bitowe ints na platformach 64-bitowych. – sigfpe

2

Zmienne lokalne są alokowane na stosie . Istnieje stała ilość miejsca stosu (zwykle 1MB-8MB, zależna od systemu operacyjnego) dostarczona do aplikacji. Ogólna zasada polega na użyciu funkcji malloc() w celu przydzielenia dużej ilości danych.

1

Odpowiedź na twoje pytanie jest prosta: stackoverflow. Nie, nie, nie strona, ale faktyczny proces "przepełnienia stosu". Nie masz wystarczającej liczby stack, aby przechowywać tę tablicę. Tak proste jak to. Robienie tego na systemach ograniczonych pamięcią jest czystym szaleństwem. Zobacz także this question.

Powiązane problemy