2016-11-18 3 views
0

Edit: wie gewünscht habe ich den Code in 'ledic' eingefügt. Es lief jedoch nie - keine davon, nicht einmal ein Hallo Weltdruck als erste Zeile, also bin ich mir relativ sicher, dass das Problem niemals in der Nähe wäre.Segmentierungsfehler beim Aufrufen der Void-Funktion

Edit2: ironisch genug, war es war innerhalb der 'ledic' Funktion. Sieht so aus, als ob ich noch weniger darüber verstehe, als ich vorher dachte.

Ich schreibe für mein aktuelles Projekt an Uni und niemand um mich herum kann diesen Segmentierungsfehler herausfinden. Es sollte ziemlich einfach sein, also schätze ich Ihre Hilfe.

-Code wie folgt:

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

void ledic(FILE *fp){ 

    printf("Hello world\n"); 

    int len; 
    int j, i, k; 
    char palavra[30]; 
    char dictionary[30][10000][30]; 
    int VecOcorrencias[30]; 


    for (j=0; j<30; j++) 
    VecOcorrencias[j]=0; 

    printf("Hello world\n"); 

    while (fscanf(fp, "%s", palavra) == 1) { 

     len = strlen(palavra); 
     k = VecOcorrencias[len]; 
     strcpy (dictionary[len][k], palavra); 
     VecOcorrencias[len]++; 
    } 
for (i=0; i<1000; i++) 
printf("%s %d\n", dictionary[5][i], VecOcorrencias[5]); 
} 

} 

FILE *OpenFile(char *nome, char *mode){ 

FILE *fp; 
fp = fopen (nome, mode); 
if(fp == NULL){ 
    printf(" Cant open file\n"); 
    exit(1); 
} 

return (fp); 
} 

int main(int argc, char *argv[]){ 

FILE * fp; 

fp = OpenFile(argv[1], "r"); 

ledic(fp); 

return(0); 

} 

Der Code bricht, wenn es die eintritt void ledic(FILE *fp) Funktion, und sagt, dass es nicht den referenzierte Speicher zugreifen kann (ich nehme an * fp).

Ich kann nicht für das Leben von mir herauszufinden, warum. Irgendwelche Gedanken?

+1

Was ist der Code innerhalb Ihrer 'ledic' Funktion? Bitte fügen Sie dies in Ihre Frage ein. – byxor

+2

Es ist wahrscheinlich etwas, das Sie in 'ledic()' tun, das ist problematisch. Können Sie 'ledic()' s Code posten? Vorzugsweise ein [MCVE]. – usr

+0

Das Problem ist wahrscheinlich in der "ledic" -Funktion, die Sie nicht angezeigt haben ... Auf meinem Computer funktioniert der Code, den Sie gepostet gut funktioniert. –

Antwort

3

Die Deklaration char dictionary[30][10000][30]; erstellt eine 9Mb Variable 30 * 30 * 1000 = 9'000'000. Da es sich um eine lokale Variable handelt, wird sie auf dem Stack erstellt und die Standard-Stackgröße auf einem typischen Linux-Rechner beträgt nur 8 MB (unter Windows ist es sogar nur 1 MB).

Wenn Sie es als static deklarieren, befindet sich die Variable nicht auf dem Stapel und kann daher mehr Speicher als die Stapellänge aufnehmen.

Weitere Informationen zum Schlüsselwort static finden Sie unter this SO article.

+0

Vielen Dank, sowohl für die Antwort als auch für den Kontext und das Lesen! – aqueiro

Verwandte Themen