2017-01-19 7 views
-1

Я хочу, чтобы главный возвращал позицию появления «mdl» в «dati». Я настроил функцию «схемы», чтобы найти отправную точку в каждом случае, но когда я запустить программу из командной строки, она возвращает:Как устранить ошибку сегментации 11?

Segmentation fault: 11 

Я не знаю, как решить эту проблему. Вот код:

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

int schema(int testo[], int nT, int modello[], int nM, int primo) { 

    int i, j, k; 
    static int r[12]; 

    j=0; 
    for(i=primo; i<nT; i++) { 
     if(testo[i] == modello[0] && testo[i+1] == modello[1] && testo[i+2] == modello[2] && testo[i+3] == modello[3] && testo[i+4] == modello[4] && testo[i+5] == modello[5] && testo[i+6] == modello[6] && testo[i+7] == modello[7]) { 
     r[j] = i+1; 
     j++; 
     } 
    } 

    return *r; 
} 



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

    FILE *in; 
    FILE *out; 

    int i, m; 
    const int n = 100; 
    int dati[n]; 
    int *soluzione; 
    int start; 

    if ((in=fopen("dati.txt", "r"))==NULL){ 
     return -1; 
    } 

    for(i=0; i<n; i++) { 
     if (fscanf(in, "%d", &dati[i]) < 0){ 
      fclose(in); 
      return i; 
     } 
    } 

    int mdl[] = {0,0,0,1,1,1,0,1}; 
    m = sizeof(mdl)/sizeof(mdl[0]); 

    *soluzione = schema(dati, n, mdl, m, start); 

    for(i=0; i<12; i++) { 
     printf("- risultato[%d] = %d\n", i, soluzione[i]); 
    } 

    //out = fopen("risultati.txt", "w"); 
    //... 

    fclose(in); 

    return 1; 
} 

я должен использовать функцию, чтобы найти вхождение, я не могу использовать другие способы.

+1

Protip номер один: включите предупреждения для своего компилятора и обратите внимание на них (желательно, также устанавливая их как ошибки). –

+0

'* soluzione = schema (dati, n, mdl, m, start);': 'soluzione' и' start' неинициализированы. – BLUEPIXY

+0

@ н.м. У меня есть предупреждения, и когда я скомпилировал программу, не было ошибок или предупреждений ... – FranzGoogle

ответ

3

Вы разыменование указателя soluzione, но он никогда не был инициализирован со значением:

int *soluzione; 
... 
*soluzione = schema(dati, n, mdl, m, start); 

Чтением неинициализированного значения, а также впоследствии разыменование, что неинициализированное значение, вызывает undefined behavior. В этом случае он проявляется в ошибке сегментации.

В этом случае вам не нужен указатель. Просто объявите переменную как int.

int soluzione; 
... 
soluzione = schema(dati, n, mdl, m, start); 

Вы также не инициализируете start. В результате вы указываете на testo в неизвестном месте, которое может находиться за пределами массива. Это также вызывает неопределенное поведение.

EDIT:

Похоже, что вы на самом деле возвращение неправильного типа данных из schema. Если вы хотите вернуть указатель на локальный массив r (который в данном случае это хорошо, так как он объявлен как static, функция должна возвращать int * и вы должны return r.

Тогда в main вы бы держать soluzione как указатель, но присвоить ему непосредственно

int *schema(int testo[], int nT, int modello[], int nM, int primo) { 
    ... 
    return r; 
} 

int main(int argc, char** argv) { 
    ... 
    int *soluzione; 
    ... 
    soluzione = schema(dati, n, mdl, m, start); 
+2

Обратите внимание, что 'start' также не инициализируется. –

+0

@ Владислав Мартин Хороший улов. Отредактировано для включения. – dbush

+0

@dbush Спасибо. Я понял, и я исправил код. Но теперь у меня возникла новая проблема: она вызывает ошибку: 'error: индексированное значение не является массивом, указателем или вектором printf (" - risultato [% d] =% d \ n ", i, soluzione [ i]); ' – FranzGoogle

0

Я предполагаю, что ошибка заключается в следующем фрагменте кода:.

for(i=primo; i<nT; i++) { 
    if(testo[i] == modello[0] && testo[i+1] == modello[1] && testo[i+2] == modello[2] && testo[i+3] == modello[3] && testo[i+4] == modello[4] && testo[i+5] == modello[5] && testo[i+6] == modello[6] && testo[i+7] == modello[7]) { 

Заметьте, что вы pass dati, который представляет собой целочисленный массив размером n, как testo, и вы передаете n в качестве значения для nT. Следовательно, testo имеет размер nT. Но в вашей петле, где i потенциально работает до nt-1, вы получаете доступ к testo[i+7], что превышает границы testo, правильно?

+0

Я думаю, что вы правы, спасибо. Но в более простой версии той же программы это не создавало проблем, я не знаю, почему ... Я не эксперт, я его изучаю. – FranzGoogle

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