Как исправить ошибку сегментации 11?

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

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;
}

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

2 ответа

Решение

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

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

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

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

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

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

РЕДАКТИРОВАТЬ:

Похоже, вы на самом деле возвращаете неправильный тип данных из 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);

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

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]) {

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

Другие вопросы по тегам