#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++;
}
//}
}
答案 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
命令检查程序的状态(局部变量等),并且可以分别使用up
和down
在堆栈中上下移动。
例如:
(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);
由于数组的名称包含该数组的基址(指向第一个元素的地址)。