C 为什么我会出现分段错误(核心转储)
对于noob的问题我很抱歉,但是我在论坛上没有发现任何人有类似的问题(或者我对他们理解不够) 我是C语言的新手,在编写一个使用函数和指针填充2D数组的程序时遇到了一个挑战,到目前为止,我的代码如下:C 为什么我会出现分段错误(核心转储),c,C,对于noob的问题我很抱歉,但是我在论坛上没有发现任何人有类似的问题(或者我对他们理解不够) 我是C语言的新手,在编写一个使用函数和指针填充2D数组的程序时遇到了一个挑战,到目前为止,我的代码如下: #include <stdio.h> #include <stdlib.h> int testef(int i, int j, int **teste){ if(i == 2){ return 0; } if(j == 2){
#include <stdio.h>
#include <stdlib.h>
int testef(int i, int j, int **teste){
if(i == 2){
return 0;
}
if(j == 2){
return testef(i+1,0,&teste);
}
else{
printf("Value[%d][%d]: ",i,j);
scanf("%d",&teste[i][j]);
return testef(i,j+1,&teste);
}
}
int main() {
int teste[2][2];
int i = 0;
int j = 0;
testef(i,j,&teste[2][2]);
return 0;
}
#包括
#包括
int testef(int i,int j,int**teste){
如果(i==2){
返回0;
}
如果(j==2){
返回testef(i+1,0和teste);
}
否则{
printf(“值[%d][%d]:”,i,j);
scanf(“%d”、&teste[i][j]);
返回testef(i、j+1和teste);
}
}
int main(){
int teste[2][2];
int i=0;
int j=0;
testef(i、j和teste[2][2]);
返回0;
}
我可以很容易地在带有for循环的主函数中完成它,但挑战是让函数用指针完成它。但是由于某种原因,一旦编译器到达调用函数的行,我就会得到一个分段错误(内核转储)错误。你知道为什么吗?我尝试过很多论坛,但没有发现任何人有类似的问题。这里的基本问题似乎是您错误地试图同时使用双指针和2D数组,而实际上您只需要2D数组(可以通过多种方式实现,但显式堆栈分配的2D数组比动态分配的数组更简单) 要解决最基本的问题,请执行以下操作:
main
)teste
仅int teste[2][2];
,而不是*
s作为指针,以获得块分配的2D数组testef
更改为接收int teste[2][2]
(无需指定第一个维度,但必须指定第二个维度),以匹配它将接收的内容scanf
应该是scanf(“%d”和&teste[i][j]);
(因此它得到要存储的地址,而不是试图解释为int*
的int
值)returntestef(i,j++,teste);
更改为returntestef(i,j+1,teste);
因此您实际上传递了一个递增的值(传递j++
将未经修改的j
传递给递归调用,稍后再传递递增的j
)testef
因此它不会总是递归;照此,它将永远递归(j
将从0
到2
再回到0
,直到遇到堆栈溢出)。您需要确保它最终会命中终端盒并返回到main
(从逻辑上讲,正确的答案似乎是“在初始化所有四个元素之后”)更改1-3是一个一揽子交易,完全消除了显式动态分配的需要。您可以使用
int**
和一些显式malloc
和free
调用,但是考虑到硬编码数组的尺寸,使用块2D数组更简单、更有效。提示:您在哪里分配了值teste
应该指向?另外,旁注:返回testef(i,j++,teste);
没有按照您的想法执行;j++
计算为j
的原始值,而不是增量值(j
随后递增,但递归调用接收原始值,此后您从未使用过j
,因此增量实际上没有任何作用)。您可能希望返回testef(i,++j,teste);
,因此递增的值被传递。您应该会收到一条关于参数类型不匹配的警告。testef()
要求参数类型为int**
,但您给它的是int**[2][2]
@ShadowRanger或返回testef(i,j+1,teste);
。如果变量之后未使用,则无需使用增量运算符。cdecl>explain int**teste[2][2]声明teste为指向int的指针的数组2的数组2 cdecl>explain int**teste声明teste为指向int的指针的数组2
这两件事不是same做了你提到的所有更改并编辑了关于这个问题的代码。现在我的代码返回相同的错误,但在第一次scanf()之后而不是当我打电话给function@GustavoAraújo:我错过了一件事;你不应该在递归调用中传递&teste
,只要teste
;你收到了正确的类型,你只需传递它,而不传递它的地址(这会增加另一层间接寻址)。