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那样声明它吗?指向指针的指针是