【问题标题】:Segmentation fault: 11 on c program分段错误:c程序上的11
【发布时间】:2013-08-10 07:39:53
【问题描述】:

在我的代码中:

int nAlunos, nNotas;

/*size input*/

scanf("%d", &nAlunos);

scanf("%d", &nNotas);

/*arrays*/

int ordenador [nAlunos];
char listaNomes [nAlunos][16];
float listaNotas [nAlunos][nNotas+1];

/*non-arrays*/

int i, k;

/*input*/

for(i = 0; i < nAlunos; i++){
    scanf("%s", listaNomes[i]);
    for(k = 1; k <= nNotas; k++){
        scanf("%f", &listaNotas[i][k]);
    }
}


/*sum of grades / number os grades for each person*/

for(i = 0; i < nAlunos; i++){
    listaNotas[i][0] = 0;

    for(k = 1; k <= nNotas; k++)
        listaNotas[i][0] += listaNotas[i][k];

    listaNotas[i][0] /= nNotas;
}


/*process order on vector*/

for(i = 0; i < nAlunos; i++){
    menor = 1111;

    for(k = i; k < nAlunos; k++)
        if (listaNotas[k][0] < menor)
            menor = listaNotas[k][0];

    for(k = i; listaNotas[k][0] != menor; k++){}

    ordenador[k] = i;
    ordenador[i] = k;
}
for(i = 0; i < nAlunos; i++)
    printf("%d", ordenador[i]);

}

我正在尝试从用户那里填充数据表,我可能不会对此类使用指针。

它需要接收呈现的数据:

String1
float1 float2...
String2
.
.
.

运行它时,它运行良好,直到我完成最后一个输入。之后它只是中断执行并返回我分段错误:11

我试图找到它可能在哪里访问不正确的内存,但这对我来说没有意义,因为我找不到它。

【问题讨论】:

  • 我不能使用动态分配,我需要listaNotas[i][0]作为其他方式,所以我不会写它。
  • 所以你的程序在你上面发布的内容之后中断了一段时间?那你为什么不把剩下的展示出来呢? (@Joni:VLA 是完美的 C.)
  • 这段代码在 GCC 上运行良好。
  • 为什么是scanf("%s", listaNomes[i]) 而不是scanf("%s", listaNomes[i*16])? (查看您对数组 listaNomes 的定义)
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。在这种情况下,创建 SSCCE (Short, Self-Contained, Correct Example) 是个好主意;更容易看出出了什么问题。获取有关您正在输入的数据的信息也将有所帮助。您没有检查来自 scanf() 的返回值以确保转换正常(但您应该)。您没有限制输入量(您应该使用"%15s" 来读取字符串以确保没有缓冲区溢出。但是,给定有效数据,到目前为止应该没问题。

标签: c arrays sorting segmentation-fault scanf


【解决方案1】:
for(k = i; listaNotas[k][0] != menor; k++){}

上面的语句导致了数组的越界访问!因此segmentation fault。根据您的功能进行处理。

条件listaNotas[k][0] != menor 是致命的。

【讨论】:

    【解决方案2】:

    这是您的代码的简单改编,对 scanf() 调用进行错误检查:

    #include <stdio.h>
    #include <stdlib.h>
    
    static void err_exit(const char *msg);
    
    int main(void)
    {
        int nAlunos, nNotas;
    
        if (scanf("%d", &nAlunos) != 1 || scanf("%d", &nNotas) != 1)
            err_exit("failed to read dimensions");
    
        char listaNomes[nAlunos][16];
        float listaNotas[nAlunos][nNotas+1];
        int i, k;
    
        for (i = 0; i < nAlunos; i++)
        {
            if (scanf("%s", listaNomes[i]) != 1)
                err_exit("failed to read name");
    
            for (k = 1; k <= nNotas; k++)
            {
                if (scanf("%f", &listaNotas[i][k]) != 1)
                    err_exit("failed to read grade");
            }
        }
    
        for (i = 0; i < nAlunos; i++)
        {
            printf("%s:", listaNomes[i]);
            for (k = 1; k <= nNotas; k++)
                printf(" %f", listaNotas[i][k]);
            putchar('\n');
        }
        return 0;
    }
    
    static void err_exit(const char *msg)
    {
        fprintf(stderr, "%s\n", msg);
        exit(1);
    }
    

    给定输入文件:

    3
    4
    name-the-first
    12 13 14 15
    name-the-second
    21 22 23 24
    name-the-third
    31 310 3109 31098
    

    程序的输出是:

    name-the-first: 12.000000 13.000000 14.000000 15.000000
    name-the-second: 21.000000 22.000000 23.000000 24.000000
    name-the-third: 31.000000 310.000000 3109.000000 31098.000000
    

    这是应该的。

    代码中唯一奇怪的是for (k = 1; k &lt;= nNotas; k++) 的使用,因为它使listaNotas[i][0] 未初始化和未使用。但是,您确实分配了足够的空间,所以这不会造成麻烦。

    总结

    问题并不在您显示的代码中不言而喻。请显示崩溃的实际代码!

    【讨论】:

    • 我用整个代码更新了帖子,它还没有完成,我到目前为止正在测试它
    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2013-10-31
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多