C分割错误

时间:2014-10-15 18:31:46

标签: c

#include <stdio.h>

void lergab(char *gab);
void criamatriz (char **alunoresp, int *resp);

int main(){
    char gab[20];
    char alunoresp [100][21];
    int resp[80];

    //lergab(&gab);

    criamatriz (&alunoresp[100][21], &resp[80]);

    printf ("\n\n%d\n", alunoresp[0][0]);

    printf ("%c\n", alunoresp[0][1]);
    printf ("%c\n", alunoresp[0][1]);
    printf ("%c\n", alunoresp[0][19]);






    return 0;
}

void lergab (char *gab){
    int i;
    for(i=0; i<20; i++)
        scanf("%c\n" , &gab[i]);
    printf("%c", gab[19]);
}

void criamatriz (char **alunoresp,int *resp){
    int i = 0, j;

    //for (i = 0; i <= 100; i++){

        scanf ("%c", &alunoresp[i][0]);

        for (j = 0; j < 80; j++){
            scanf ("%d", &resp[j]);
        }

        for (j = 0; j < 80; j=j+4){

                int g = 1;

                if ((resp[j] + resp[j+1] + resp[j+2] + resp[j+3]) != 1)
                    alunoresp[i][g] = 'e';
                else if (resp[j] == 1)
                    alunoresp[i][g] = 'a';
                else if (resp[j+1] == 1)
                    alunoresp[i][g] = 'b';
                else if (resp[j+2] == 1)
                    alunoresp[i][g] = 'c';
                else if (resp[j+3] == 1)
                    alunoresp[i][g] = 'd';

                g++;

        }
    //}
}

此代码应该读取一个数字作为ASCII码,然后读取80个数字并将它们转换为各自的字符,就像电子测试扫描仪一样。 即: 0 0 1 0 是c, 1 0 0 0 是一个, 1 0 1 0 是一个无效的选项(因为你应该只为每个问题签一个答案)。

代码只是一个测试,我的目标是创建一个矩阵,其中包含100个候选者,每个候选者有20个答案,以及他们的识别码,这是第一个读取为ASCII的数字,因此alunoresp [100] [21 ]宣布。 我每次尝试在gcc上运行它时都会出现分段错误,有什么想法吗?

编辑:

感谢索引事项的帮助。我没有注意到。 Stil,即使在修复后我仍然会遇到分段错误。

代码现在看起来像这样:

#include <stdio.h>

void lergab(char *gab);
void criamatriz (char **alunoresp, int *resp);

int main(){
    char gab[20];
    char alunoresp [100][21];
    int resp[80];

    //lergab(&gab);

    criamatriz (&alunoresp, &resp);

    printf ("\n\n%d\n", alunoresp[0][0]);

    printf ("%c\n", alunoresp[0][1]);
    printf ("%c\n", alunoresp[0][1]);
    printf ("%c\n", alunoresp[0][19]);






    return 0;
}

void lergab (char *gab){
    int i;
    for(i=0; i<20; i++)
        scanf("%c\n" , &gab[i]);
    printf("%c", gab[19]);
}

void criamatriz (char **alunoresp,int *resp){
    int i = 0, j;

    //for (i = 0; i <= 100; i++){

        scanf ("%c", &alunoresp[i][0]);

        for (j = 0; j < 80; j++){
            scanf ("%d", &resp[j]);
        }

        for (j = 0; j < 80; j=j+4){

                int g = 1;

                if ((resp[j] + resp[j+1] + resp[j+2] + resp[j+3]) != 1)
                    alunoresp[i][g] = 'e';
                else if (resp[j] == 1)
                    alunoresp[i][g] = 'a';
                else if (resp[j+1] == 1)
                    alunoresp[i][g] = 'b';
                else if (resp[j+2] == 1)
                    alunoresp[i][g] = 'c';
                else if (resp[j+3] == 1)
                    alunoresp[i][g] = 'd';

                g++;

        }
    //}
}

4 个答案:

答案 0 :(得分:3)

您的计划有两个问题:

  • 您正在调用criamatriz函数 - 而不是将指针传递给数组的末尾,您应该自己传递数组,并且
  • 您的criamatriz函数错误地使用了2D数组 - 您将它传递给指向指针的指针,这是不正确的。你应该像指向21个元素的数组一样传递它。

以下是您应该如何声明和定义criamatriz函数:

void criamatriz(char (*alunoresp)[21], int *resp);

这样称呼:

criamatriz(alunoresp, resp);

答案 1 :(得分:2)

criamatriz (&alunoresp[100][21], &resp[80]);
                      ^^^^^^^^^

您超过了阵列中允许的最大索引数。 e.g。

int x[10]; // allows index 0->9

答案 2 :(得分:1)

欢迎来到SO,Lucas!

  

每次尝试在gcc上运行它时,我都会遇到分段错误,有什么想法吗?

第0步是让自己成为调试器,这不是您最后一次遇到类似问题。如果您使用gcc,那么gdb可用于此系统是个不错的选择。尝试使用gdb运行您的可执行文件,X标记该位置!

gdb ./my_binary

......然后..

run

执行将在发生无效内存访问的位置停止。您可以使用print命令检查程序的状态(局部变量等),并且可以分别使用updown在堆栈中上下移动。

例如:

(gdb) run
Starting program: ./go 

Program received signal SIGSEGV, Segmentation fault.
0x00000000004004fd in inner () at ./go.c:6
6       int ohno = *bad;
(gdb) bt
#0  0x00000000004004fd in inner () at ./go.c:6
#1  0x0000000000400512 in outer () at ./go.c:11
#2  0x000000000040052d in main (argc=1, argv=0x7fffffffdf88) at ./go.c:16
(gdb) backtrace
#0  0x00000000004004fd in inner () at ./go.c:6
#1  0x0000000000400512 in outer () at ./go.c:11
#2  0x000000000040052d in main (argc=1, argv=0x7fffffffdf88) at ./go.c:16

答案 3 :(得分:0)

将数组发送到函数时,您只需发送该数组的基址

即可

在您的代码中

criamatriz (&alunoresp[100][21], &resp[80]);

这一行实际上是在发送alunoresp[100][21]元素的地址,甚至不存在。

定义为int alunoresp[100][21]的数组具有最大索引[99][20],因为索引从0开始

你需要调用这个函数,

criamatriz (alunoresp, resp);

由于数组的名称包含该数组的基址(指向第一个元素的地址)。