Assegnazione variabile di errore di segmentazione (core dumped)

Ho un programma scritto in C ++, compilato con G ++, in esecuzione su Ubuntu 13.04 a 32 bit, che sta dando il seguente errore: “Errore di segmentazione (core dumped)”.

int main(int argc, char *argv[]){ printf("1\n"); int x = 0 , y = 0, count = 0; printf("2\n"); char c; printf("3\n"); int n_frames = (atoi(argv[1]) - 1); printf("4\n"); int windowSize = WINDOW_SIZE; // WINDOW_SIZE is a define printf("5\n"); // And the program go on.... long double frames[n_frames][377]; long double dis_frames[n_frames - (windowSize - 1)]; int tam_dis_frames = n_frames - (windowSize - 1); long double white_top_hat[tam_dis_frames]; 

Quando il valore “n_frames” (quello portato da argv [1]) è più basso (testato fino a 300) l’errore non si verifica e tutto va bene.

Quando il valore è più alto (come 1922) accade l’errore. Quando si verifica l’errore, l’ultima stampa mostrata è la quarta, “printf (” 4 \ n “)”.

Quando il valore è 1853 o inferiore, viene visualizzato “printf (” 5 \ n “)” ma non viene visualizzato il successivo printf.

Qualcuno ha qualche idea su cosa potrebbe risolverlo? Quale potrebbe essere la causa del guasto alla segmentazione (core dumped) in un passaggio così semplice del programma ….

    L’array di frames viene creato nello stack utilizzando una dimensione dynamic passata dall’utente nella riga di comando. Sei già fuori dal territorio standard del C ++ e usi un’estensione / C99ism chiamata “Array a lunghezza variabile”.

    Inoltre, il valore n_frames hai n_frames (1922) rende l’array di frame 1922 * 377 * 10 byte, ovvero circa 7,5 MB. Su quasi tutti i computer desktop / laptop / sistemi operativi standard, il limite di dimensioni dello stack è di circa 1 MB, quindi il tuo limite è rotto in due modi diversi.

    L’ovvia soluzione diretta al tuo problema è di allocare dynamicmente i frames modo:

     long double** frames = new (long double*)[n_frames]; for (int i = 0; i < n_frames; ++i) { frames[i] = new long double[377]; } 

    ... e naturalmente non dimenticare la delete [] corrispondente delete [] alla fine.

    Tuttavia, detto questo, probabilmente vorrai conoscere std::vector come class di array allocata dynamicmente di fatto in C ++.

    Questo è un overflow dello stack. Si sta utilizzando un numero di array di lunghezza variabile (VLA) e per valori elevati di n_frames si riversa lo stack. Utilizzare invece memoria allocata dynamicmente.

    Sospetto che non ti sei nemmeno reso conto che stai usando VLA. Sono una caratteristica molto facile da usare impropriamente e, a meno che tu non comprenda veramente tutte le implicazioni del loro uso, dovresti evitarli.

    Il tuo codice sembra molto più simile a C che a C ++. A mio avviso, è giunto il momento per voi di imparare come fare le cose in modo C ++. Dovresti davvero evitare l’allocazione di memoria grezza. E certamente non dovresti chiamare printf e non chiamare mai atoi.