2016-11-18 2 views
0

Редактировать: по запросу Я включил код в «led». Тем не менее, он никогда не запускался - ни один из них, даже не приветствующий мир printf, как первая строка, поэтому я уверен, что проблема никогда не будет в пределах.Ошибка сегментации при вызове функции void

Edit2: по иронии судьбы, это был в функции 'led'. Похоже, я понимаю об этом меньше, чем раньше.

Я пишу для своего текущего проекта в Uni, и никто вокруг меня не может понять эту ошибку сегментации. Это должно быть довольно просто, поэтому я ценю вашу помощь.

код следующим образом:

#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); 

} 

Кодекса перерывы, когда она входит в функцию void ledic(FILE *fp), и говорит, что не может получить доступ к памяти (ссылка я полагаю * Fp).

Я не могу для жизни понять, почему. Есть предположения?

+1

Каков код внутри вашей функции '' led''? Пожалуйста, включите это в свой вопрос. – byxor

+2

Вероятно, это что-то, что вы делаете в 'ledic()', что проблематично. Можете ли вы отправить код 'ledic()'? Предпочтительно [MCVE]. – usr

+0

Проблема скорее всего в функции '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

ответ

3

Объявление char dictionary[30][10000][30]; создает переменную 9Mb 30 * 30 * 1000 = 9'000'000. Поскольку это локальная переменная, она создается в стеке, а размер стека по умолчанию на типичной машине Linux составляет всего 8 Мб (в Windows это всего лишь 1 Мб).

Если вы заявляете, что это static, переменная не находится в стеке, и поэтому она может занимать больше памяти, чем стекирование.

См. this SO article для получения более подробной информации о ключевое слово static.

+0

Большое вам спасибо, как за ответ, так и за контекст и прочитанный! – aqueiro

Смежные вопросы