Perché 248×248 è la dimensione di array bidimensionale massima che posso dichiarare?

Ho un problema di programma per il quale vorrei dichiarare un array 256×256 in C. Sfortunatamente, ogni volta che provo a dichiarare un array di tale dimensione (interi) e ad eseguire il mio programma, esso termina in modo imprevisto. Eventuali suggerimenti? Non ho provato l’allocazione di memoria dal momento che non riesco a capire come funziona con gli array multidimensionali (sentiti libero di guidarmi attraverso di esso anche se sono nuovo di C). Un’altra cosa interessante da notare è che posso dichiarare un array 248×248 in C senza problemi, ma non più grande.

dims = 256; int majormatrix[dims][dims]; 

Compilato con:

 gcc -msse2 -O3 -march=pentium4 -malign-double -funroll-loops -pipe -fomit-frame-pointer -W -Wall -o "SkyFall.exe" "SkyFall.c" 

Sto usando SciTE 323 (non so come controllare la versione di GCC).

Esistono tre posizioni in cui è ansible allocare un array in C:

  • Nella memoria automatica (comunemente indicata come “in pila”)
  • Nella memoria dynamic ( malloc / free ), o
  • Nella memoria statica (parola chiave static / spazio globale).

Solo la memoria automatica ha vincoli piuttosto severi sulla quantità di allocazione (cioè, oltre ai limiti impostati dal sistema operativo); allocazioni dinamiche e statiche potrebbero potenzialmente occupare quasi tutto lo spazio che è reso disponibile al tuo processo dal sistema operativo.

Il modo più semplice per vedere se questo è il caso è spostare la dichiarazione fuori dalla tua funzione. Questo porterebbe la tua matrice alla memoria statica. Se gli arresti anomali continuano, non hanno nulla a che fare con le dimensioni dell’array.

A meno che tu non stia utilizzando una macchina / compilatore molto vecchia, non c’è motivo che dovrebbe essere troppo grande. Mi sembra che il problema sia altrove. Prova il seguente codice e dimmi se funziona:

 #include  int main() { int ints[256][256], i, j; i = j = 0; while (i<256) { while (j<256) { ints[i][j] = i*j; j++; } i++; j = 0; } printf("Made it :) \n"); return 0; } 

Non si può necessariamente presumere che “termini inaspettatamente” sia necessariamente direttamente a causa della “dichiarazione di un array 256×256”.

SUGGERIMENTO:

1) Fai bollire il tuo codice su un semplice esempio indipendente

2) Eseguilo nel debugger

3) Quando “termina inaspettatamente”, usa il debugger per ottenere un “trace traceback” – devi identificare la linea specifica che sta fallendo

4) Si dovrebbe anche cercare un messaggio di errore specifico (se ansible)

5) Pubblica il tuo codice, il messaggio di errore e il traceback

6) Assicurati di dirci quale piattaforma (ad es. Centos Linux 5.5) e compilatore (es. Gcc 4.2.1) stai usando anche tu.