C分割错误 #包括 void lergab(char*gab); void criamatriz(字符**alunoresp,int*resp); int main(){ char-gab[20]; char alunoresp[100][21]; 国际响应[80]; //勒尔加布(和加布); 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]); 返回0; } 无效lergab(字符*gab){ int i; 对于(i=0;i

C分割错误 #包括 void lergab(char*gab); void criamatriz(字符**alunoresp,int*resp); int main(){ char-gab[20]; char alunoresp[100][21]; 国际响应[80]; //勒尔加布(和加布); 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]); 返回0; } 无效lergab(字符*gab){ int i; 对于(i=0;i,c,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 (&al

向函数发送数组时,只需发送该数组的基址

在代码中

#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++;

        }
    //}
}
此行实际上发送的是
alunoresp[100][21]
元素的地址,该元素甚至不存在

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

你需要像这样调用函数

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

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

向函数发送数组时,只需发送该数组的基址

criamatriz (alunoresp, resp);
在代码中

#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++;

        }
    //}
}
此行实际上发送的是
alunoresp[100][21]
元素的地址,该元素甚至不存在

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

你需要像这样调用函数

criamatriz (&alunoresp[100][21], &resp[80]);
因为数组的名称包含该数组的基址(指向第一个元素的地址)

criamatriz (alunoresp, resp);
您正在超出数组中允许的最大索引。例如

criamatriz (&alunoresp[100][21], &resp[80]);
                      ^^^^^^^^^
您正在超出数组中允许的最大索引。例如

criamatriz (&alunoresp[100][21], &resp[80]);
                      ^^^^^^^^^
欢迎来到苏,卢卡斯

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

第0步是给自己找一个调试器,这不会是你最后一次遇到类似问题。如果你使用的是
gcc
,很有可能
gdb
在这个系统上可用。试着用
gdb
运行你的可执行文件,并且X标记该点

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

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

例如:

run
欢迎来到苏,卢卡斯

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

第0步是给自己找一个调试器,这不会是你最后一次遇到类似问题。如果你使用的是
gcc
,很有可能
gdb
在这个系统上可用。试着用
gdb
运行你的可执行文件,并且X标记该点

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

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

例如:

run

您的程序存在两个问题:

  • 您错误地调用了
    criamatriz
    函数
    -您应该传递数组本身,而不是将指针传递到数组的末尾
  • 您的
    criamatriz
    函数错误地获取了一个2D数组
    -您将其作为指向指针的指针进行传递,这是不正确的。您应该将其作为指向21个元素数组的指针进行传递
以下是您应该如何声明和定义
criamatriz
函数:

(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
可以这样称呼:

#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++;

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

您的程序存在两个问题:

  • 您错误地调用了
    criamatriz
    函数
    -您应该传递数组本身,而不是将指针传递到数组的末尾
  • 您的
    criamatriz
    函数错误地获取了一个2D数组
    -您将其作为指向指针的指针进行传递,这是不正确的。您应该将其作为指向21个元素数组的指针进行传递
以下是您应该如何声明和定义
criamatriz
函数:

(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
可以这样称呼:

#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++;

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

请提高编译器的警告级别,所有这些都是应该诊断的直接错误。另外,请阅读一本关于指针和数组之间差异的好教程或书籍。请提高编译器的警告级别,所有这些都是应该诊断的直接错误。还请阅读一本好的教程关于指针和数组之间的区别的al或书籍。即使在修复之后,我仍然会遇到分段错误:(即使在修复之后,我仍然会遇到分段错误:(耸耸肩,我想我可以去meta找到同样的答案。但IMO OP比其他人更需要这个答案。评论太简洁了。我会接受否决票,如果卢卡斯能利用这一点是值得的。如果这个问题对其他人有用,而不是问它的人,那将是一个非常不同的情况。总之,这是一个很好的坦诚日期将被搁置。但在此期间,我会把OP当作一个同事问同样的问题。嘲笑,这个问题或我的答案——耸耸肩,我想我可以去梅塔找到同样的事情。但IMO OP比其他人更需要这个答案。评论太简洁了。我会接受否决票,如果卢卡斯能占上风,这是值得的ge。如果这个问题对提出问题的人以外的其他人有用,那将是一个非常不同的情况。底线是,这是一个很好的被搁置的候选者。但与此同时,我会把OP当作一个同事问同样的问题。嘲笑,这个问题或我的答案——你确定吗?我的目标是创建一个21个元素的数组数组,我不应该像**alunoresp?@LucasSartori那样声明它吗?指向指针的指针是