二级指针如何正确传参

#include<stdio.h>
void cal(char **p,int m,int n);
int t=0;
int main(void)
{
    int n,m;
    int i,j;
    char a[1001][101];
    char *p1=a[0];
    char **dui=&p1;
    for(i=0;i<=1000;i++){
        for(j=0;j<101;j++){
            a[i][j]='0';
        }
    }
    scanf("%d%d",&n,&m);
    getchar();
    for(i=1;i<n+1;i++){
        for(j=1;j<=m;j++){
            a[i][j]=getchar();
        }
        getchar();
    }
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            cal(dui,i,j);
        }
    }
    printf("%d",t);
    return 0;
}

void cal(char **p,int m,int n)
{
    if(*(*(p+m)+n)=='0'){
        ;
    }else{
        int cnt=0;
        if(*(*(p+m+1)+n)!='0'){
            cal(p,m+1,n);
            *(*(p+m+1)+n)='0';
        }else{
            cnt++;
        }
        if(*(*(p+m-1)+n)!='0'){
            cal(p,m-1,n);
            *(*(p+m-1)+n)='0';
        }else{
            cnt++;
        }
        if(*(*(p+m)+n+1)!='0'){
            cal(p,m,n+1);
            *(*(p+m)+n+1)='0';
        }else{
            cnt++;
        }
        if(*(*(p+m)+n-1)=='0'){
            cal(p,m,n-1);
            *(*(p+m)+n-1)='0';
        }else{
            cnt++;
        }
        if(cnt==4){
            t++;
        }
        *(*(p+m)+n)='0';
    }
}

运行结果是 return value 3221225477
应当是函数里的二级指针出现问题,应该怎样改正呢

这么传递是不行的。将参数改为 char (*p)[101],然后调用的时候传入a就可以了
另外这个递归里面也有问题,没有确保递归时m和n一定在有效范围,比如是否出现负数,因为有 n-1和m-1的操作。