Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我会出现分段错误(核心转储)_C - Fatal编程技术网

C 为什么我会出现分段错误(核心转储)

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){

对于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){
        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
    ;你收到了正确的类型,你只需传递它,而不传递它的地址(这会增加另一层间接寻址)。