C语言中Collat​​z猜想程序中的分段错误

时间:2014-03-27 15:30:24

标签: c

我正在运行此程序(对于Collatz Conjecture)并且我在第33行遇到了分段错误,但第33行在块的末尾只是}。我不知道这是否是一个堆栈问题。你能帮忙吗?

int main(int argc, char** argv) {
    int x,y,temp;
    int  maximum_cycle[MAX_NUMERO];
    scanf("%d",&x);
    scanf("\n%d",&y);
    if (x>y){
        temp=x;
        x=y;
        y=temp;
    }
    hallarNumeroCiclo(x,y,&maximum_cycle[MAX_NUMERO]);
    printf("\n%d %d %d\n",x,y,Maximo(x,y,&maximum_cycle[MAX_NUMERO]));
    return (EXIT_SUCCESS);
}

hallarNumeroCiclo(int x,int y,int *maximum_cycle[MAX_NUMERO]){
    int k,n;    
    for (n=0;(x < y) ;--y){
        for(k=y;k!=1;){
            if ((k % 2) ==0)
            {
                k/=2;
                n+=1;
            }
            else if ((k%2)==1)
            {
                k = 3*k+1;
                n+=1;
            }
            if (k==1) {
                n+=1;
            /*this is the line where the error occurs, the next bracket */ 
            }
        }
        *maximum_cycle[y-x]=n;
    }    
}

int Maximo(int x, int y,int *maximum_cycle[MAX_NUMERO]){
    int i;
    int maximo =0;
    for(i=0;(i>(y-x));i++){
        if (*maximum_cycle[i]>maximo){
            maximo=*maximum_cycle[i];
        }
    }
    return maximo;
}

2 个答案:

答案 0 :(得分:2)

您正在将&maximum_cycle[MAX_NUMERO]传递给hallarNumeroCircloMaximo这是一个单个整数指针!这是因为数组索引选择了一个,然后你获取它的地址。

但是,函数所需的类型是一个数组,当你尝试写它时会写 到未知/未映射的区域因此SIGSEGVing您的程序。

你的问题实际上是除指针指针之外的函数,而你传递指针。注意,为指针数组分配的空间可能比实际的整数数组小。在x86上它们是相同的,但在这里你的问题是你的代码将伪造的东西写入你的指针并且取消引用下一个指针会让你崩溃。

尝试在源代码中使用&maximum_cycle代替&maximum_cycle[MAX_NUMERO]

答案 1 :(得分:0)

这一行

int  maximum_cycle[MAX_NUMERO];

使用int个元素声明名为maximum_cycle的{​​{1}}数组。

这样做

MAX_NUMERO

向下传递给被调用函数数组hallarNumeroCiclo(x,y,&maximum_cycle[MAX_NUMERO]); 的{​​{1}}元素的地址。在C数组中,基于MAX_NUMERO + 1,我们maximum_cycle解决了他的第一个元素。


0

需要指向[0] hallarNumeroCiclo(int x,int y,int *maximum_cycle[MAX_NUMERO]); int元素数组的地址(指向),所以请调用这样的函数:

MAX_NUMERO

hallarNumeroCiclo(x,y,&maximum_cycle); 内部,您可以在将hallarNumeroCiclo作为数组使用之前正确地感受到maximum_cycle。但是[] - 运算符绑定比* - 运算符更紧密,这就是为什么这一行

*maximum_cycle[y-x]=n;

错了,应该是这样的:

(*maximum_cycle)[y-x]=n;