c - 如何修复段错误 11 错误?

标签 c segmentation-fault find-occurrences

<分区>

我希望主要返回“dati”中出现“mdl”的位置。我设置了“模式”函数来查找每次出现的起点,但是当我从命令行运行程序时,它返回:

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

我必须使用该函数来查找事件,我不能使用其他方法。

最佳答案

您正在取消引用指针 soluzione,但它从未用值初始化:

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

读取未初始化的值,以及随后取消引用该未初始化的值,调用 undefined behavior .在这种情况下,它表现为段错误。

在这种情况下您不需要指针。只需将变量声明为 int

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

您也没有初始化start。结果,您在可能位于数组边界之外的未知位置对 testo 进行了索引。这也会调用未定义的行为。

编辑:

看起来您实际上从 schema 返回了错误的数据类型。如果你想返回一个指向本地数组 r 的指针(在这种情况下很好,因为它被声明为 static,函数需要返回一个 int * 并且您应该返回 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);

关于c - 如何修复段错误 11 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41747046/

相关文章:

C++ 2 嵌套for循环转换为递归

c - 需要实现一个pipe,dup2函数来执行 "ls | tr a-z A-Z > file.txt"

c++ - 如何在 C++ 中实现超过 2000 个节点的最小生成树?

java - 字符串中第 N 次出现的字符并获取值

java - 日历。反复发生的事件。如何检查开始日期是否与模式匹配?

c++ - 查找子字符串出现的次数

c - 如何将字符数组 "char *buff[]"写入 c 中的文件

c - 本地初始值存储在?

python - 在 Python C 扩展中创建 PyList_New 时出现段错误

node.js - Heroku 上的 Node 应用程序段错误:std::bad_alloc 和退出代码 134