Как исправить ошибку сегментации 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
, право?