2016-07-18 11 views
0

Ich versuche, ein Array (2x20000) auf C. Der Testcode zu schreiben ist:Array-Deklaration: C Segmentation fault

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

double test(int smod) 
{ 
// 
// test subroutine 
// 
double vect_fma[2][20000]; 
int i; 

// write on file // 
FILE *f = fopen("file.txt", "w"); 
/////////////////// 

    for(i = 1; i < 20001; i = i + 1){  
    // allocate the vector for the fma analysis 
    vect_fma[1][i] = i*smod; 
    vect_fma[2][i] = i*smod; 
    if (i%smod == 0) 
    fprintf(f, "%f %f %f \n", 1.0*i, vect_fma[1][i],vect_fma[2][i]); 
}  
    fclose(f); 
    return 0; 
} 


int smod; 
void main() 
{ 
    smod = 10; // every 10 print the output 
    test(smod); // call the function 
} 

ich den Code mit gcc test.c -lm -o test zusammengestellt und ich erhielt Segmentation fault (core dumped).

Soweit ich neu auf C bin, verstehe ich, dass "the compiler tries to store it on the stack" und eine Lösung könnte die in der verknüpften Seite vorgestellt werden .... aber diese Lösung sieht ziemlich komisch (und komplex zu verstehen) im Vergleich mit Einfachere Fortran-Deklaration des Arrays real(8), dimension(n:m) :: vect_fma, die ich in ein Unterprogramm oder in einer Funktion ohne Probleme einfügen kann. Ist vielleicht die Erklärung, die ich in den Code geschrieben habe, ähnlich der Fortran real(8), dimension(n,m),allocatable :: vect_fma man?

Die Frage ist also, gibt es einen einfacheren Weg in C ein Array innerhalb einer Funktion zu deklarieren? Vielen Dank an alle.

+0

Wahrscheinlich zu groß für den Stack - verwenden Sie stattdessen den Heap –

+0

@EdHeal so etwas wie '2d_array = (int *) malloc (sizeof (int) * N * M);'? –

+0

Haben Sie den Segmentierungsfehler während der Kompilierung (was Ihre Antwort impliziert) oder während der Ausführung erhalten? – CorbinMc

Antwort

2

Sie haben Zugriff außerhalb der Grenzen an mehreren Stellen, undefined Verhalten. In C reicht ein Array-Index von 0 bis N-1, nicht von 1 bis N. Das heißt, um den Schleifenteil Umschreiben:

for(i = 0; i < 20000; i = i + 1){  
    // allocate the vector for the fma analysis 
    vect_fma[0][i] = i*smod; 
    vect_fma[1][i] = i*smod; 
    if (i%smod == 0) 
     fprintf(f, "%f %f %f \n", 1.0*i, vect_fma[0][i],vect_fma[1][i]); 
}  

Es ist möglich, 2x20000 Doppel könnten für die Stapelgröße auf Ihrem System zu groß sein, dann würden Sie das undefinierte Verhalten ersten Festsetzung besser dran und sehen, ob das Problem verschwindet.

+0

danke für deine Antwort es war richtig über die ganzen Zahlen und danke für das Beispiel gepostet. Ich habe mich mit Fortran vermischt, die von 1 bis 20000 beginnen, was bedeutet, dass ich 20000 Elemente habe, in C muss ich von 0 bis 20000 beginnen. –

+0

0 bis 19999 nicht 20000, weil '<20000' ist – Michi

2

Das Problem ist Ihre for Schleife. Sie sollten mit einer Iteration beginnen, wobei i=0 und mit einer Iteration enden, wobei i=19999. Ihr Code beginnt mit einer Iteration i=1 und endet mit einer Iteration i=20000.

Das Problem ist, dass es kein 20000. Element Ihres Arrays gibt, nur ein 19999. (null indiziert). Wenn Sie auf das 20000. Element zugreifen, greift Ihr zugreifender Systemspeicher, der Ihrem Programm nie zugeordnet wurde, einen Segmentierungsfehler auf.

Fixieren Sie Ihre for-Schleife und Sie sollten gut sein.