堆栈溢出,除非printf在递归下

时间:2012-12-09 16:04:25

标签: c recursion printf stack-overflow

下面的代码是查找3x3矩阵的行列式的代码(此代码用于nxn矩阵,但对于样本,我使用了3x3),使用递归 结果工作正常,但我想知道在调用子函数(本身)之前,这段代码中的错误必须是printf(“\ n”),否则它将返回错误0xc0000fd(堆栈溢出)。

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define size 3


void trimarray(int**rrayrc,int**rrayout, int dim,int cuti,int cutj)
{
    int i, j;
    int ti = 0,tj;

    for(i = 0; i<dim; i++)
    {
        tj = 0;
        for(j = 0; j< dim; j++)
        {
            if(!((i==cuti)||(j==cutj)))
            {
                    rrayout[ti][tj] = rrayrc[i][j];
            }
            if(j!=cutj) {tj++;}
        }
        if(i!=cuti) {ti++;}
    }

}
void initializearray(int** rray,int dim)
{
    int i, j;
    for(i = 0; i<dim; i++)
    {
        for(j = 0; j<dim; j++)
        {
            rray[i][j] = 0;
        }
    }
}
int det(int** rray, int dim)
{
    int i,j;
    int cut[dim-1][dim-1];
    int* cutp[i];
    int mul = 1,sum=0;
    if(dim >1)
    {
        for(i = 0; i<dim-1; i++)
        {
            cutp[i] = cut[i];
        }
        initializearray(cutp,dim-1);
        for(i = 0; i<dim; i++)
        {
            printf("\n",dim); //<< Without this the program won't work
            trimarray(rray,cutp,dim,0,i);
            sum+=det(cutp,dim-1)*mul*rray[0][i];
            mul = 0-mul;
        }
        return sum;

    }
    else
    {
        return rray[0][0];
    }
}
int main()
{
    int test[size][size] = {2,-3,-2,-6,3,3,-2,-3,-2};
    int* testpntr[size];
    int i,deter;
    for(i = 0; i<size; i++)
    {
        testpntr[i] = test[i];
    }
    deter = det(testpntr,size);
    printf("[%d]",deter);
    getch();

    return 0;
}

将非常感谢您的回答。

1 个答案:

答案 0 :(得分:2)

int* cutp[i];是未定义的行为,因为i在此阶段未初始化。你不知道cutp数组的大小是多少。