分段错误:c程序上有11个

时间:2013-08-10 07:39:53

标签: c arrays sorting segmentation-fault scanf

在我的代码中:

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

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

3 个答案:

答案 0 :(得分:0)

以下是对代码的简单修改,并对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 <= nNotas; k++)的使用,因为它使listaNotas[i][0]保持未初始化和未使用状态。但是,您确实分配了足够的空间,以免造成麻烦。

摘要

在您展示的代码中,问题并非显而易见。请显示崩溃的实际代码!

答案 1 :(得分:0)

如果要使用任意长度的数组,则必须使用动态内存分配。如果您不知道如何操作,可以使用大型数组,它不优雅或高效,但如果您的作业不是动态内存分配,它可以工作。

如果使用大型阵列解决方案,则必须使用足够大的阵列来管理更糟糕的情况(即:拥挤的教室或许多等级)。 类似的东西:

#define MAX_N_ALUMNOS 100 //Or more
#define MAX_N_NOTAS 100 //Or more

...

char listaNomes [MAX_N_ALUMNOS][16];
float listaNotas [MAX_N_ALUMNOS][MAX_N_NOTAS+1];

如果使用动态内存分配解决方案,则必须使用malloc和free并处理异常。 这样的事情可能有用:

#include <stdlib.h>

...

char listaNomes [];
float listaNotas [];
listaNomes = (char*) malloc (nAlunos*16);
if (listaNomes==NULL) exit (1);
listaNotas = (char*) malloc (nAlunos*(nNotas+1));
if (listaNotas==NULL) exit (1);

...

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

...

free (listaNomes);
free (listaNotas);

...

答案 2 :(得分:0)

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

以上语句导致数组的超出访问权限!因此segmentation fault。根据您的功能处理它。

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