Debugging &引用;“运行”;可以得到答案,但调试将在代码块中抛出分段错误

Debugging &引用;“运行”;可以得到答案,但调试将在代码块中抛出分段错误,debugging,segmentation-fault,codeblocks,Debugging,Segmentation Fault,Codeblocks,这不是我第一次遇到这个问题。有时,当您“运行”代码时,代码可以成功执行,但在“调试”模式下失败 “运行”模式: “调试”模式: 当使用“运行”模式时,将得到以下结果: 但是当使用“调试”模式时,它会抛出错误。 这是代码。提前谢谢 #include <stdio.h> #include <stdlib.h> #include <string.h> #define max(a,b) ((a)>(b)?(a):(b)) #define true 1 #

这不是我第一次遇到这个问题。有时,当您“运行”代码时,代码可以成功执行,但在“调试”模式下失败

“运行”模式:

“调试”模式:

当使用“运行”模式时,将得到以下结果:

但是当使用“调试”模式时,它会抛出错误。

这是代码。提前谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define true 1
#define false 0
#define N 50
#define DEBUG 1
int* power2[4*N];
int* save[4*N];
int tmp_n1[2*N], tmp_n2[2*N];
#define trim(a,n) do{ \
        int n_ = n; \
        for(i=1;i<=n_;i++) if(a[i]>=10){ \
            a[i+1] += a[i] / 10; \
            a[i] %= 10; \
        } \
        while(a[n_+1] != 0) n_++; \
        a[0] = n_; \
    }while(0)

#define trim2(a,n) do{ \
        int n_ = n; \
        for(i=n_;i>=1;i--) if(a[i]<0){ \
            a[i+1] += (a[i]-9) / 10; \
            a[i] -= (a[i]-9) / 10 * 10; \
        } \
        while(a[n_] == 0 && n_>0) n_--; \
        a[0] = n_; \
    }while(0)

#define print(a) do{ \
    int i1; \
    if(a[0] == 0) putchar('0');\
    for(i1=a[0];i1>=1;i1--) putchar(a[i1]+'0');\
    putchar('\n');\
}while(0)

#define copy(dest,src) memcpy(dest,src,2*N*sizeof(int))
#define clear(src) memset(src,0,2*N*sizeof(int))
void sum(int* a,int* b,int* c){
    int i; int n = max(a[0],b[0]);
    for(i=1;i<=n;i++) c[i]=a[i]+b[i];
    trim(c,n);
}
void minus(int* a,int* b,int* c){
    int i; int n = a[0];
    for(i=1;i<=n;i++) c[i]=a[i]-b[i];
    trim2(c,n);
}
void minusn(int* a,int n,int *c){
    int i;
    if(c != a) for(i=1;i<=a[0];i++) c[i]=a[i];
    c[1] -= n;
    trim2(c,a[0]);
}
void sumn(int* a,int n,int *c){
    int i;
    if(c != a) for(i=1;i<=a[0];i++) c[i]=a[i];
    c[1] += n;
    trim(c,a[0]);
}
void timen(int* a,int n,int* c){
    int i;
    for(i=1;i<=a[0];i++) c[i]=a[i]*n;
    trim(c,a[0]);
}
void time(int*a,int*b,int*c){
    if(a == c || b == c) printf("time no allow eq."), exit(-1);
    int i,j;
    clear(c);
    for(i=1;i<=a[0];i++) for(j=1;j<=b[0];j++)
    c[i+j-1] += a[i]*b[j];
    trim(c,a[0]+b[0]-1);
}
void setn(int* a,int n){
    int i=0;
    while(n != 0){
        a[++i] = n % 10;
        n /= 10;
    }
    a[0]=i;
}
int bigger(int*a,int*b){ // a>=b
    if(a[0] != b[0]) return a[0]-b[0];
    int i = a[0];
    while(i>0 && a[i] == b[i]) i--;
    return a[i]-b[i];
}
int eq(int* a,int* b){
    return bigger(a,b) == 0;
}
int* getNewOne(){
    return (int*) calloc(2*N,sizeof(int));
}
void freeNewOne(int* p){
    free(p);
}
void qiuhe(int* a, int* b, int* c){ // aÊ×Ïî bÄ©Ïî
    // c = (a+b)*(b-a+1)/2;
    int* head = getNewOne();
    sum(a,b,head);
    int* nail = getNewOne();
    minus(b,a,nail);
    sumn(nail,1,nail);
    time(head,nail,c);

    int i, j =c[0];
    for(i=c[0];i>=1;i--){
        c[i-1] += (c[i] & 1) * 10;
        c[i] >>= 1;
    }

    while(c[j] == 0 && j>0) j--;
    c[0]=j;
}
int eqn(int*a,int n){
    if(a[0] > 1) return false;
    return a[1] == n;
}

void f(int* start, int* output){
    if(DEBUG){
        printf("Enter:");
        print(start);
    }
    if(eqn(start,0) || eqn(start,1) || eqn(start,2)) { setn(output,0); return; }

    int saveId = -1;
    int i;
    for(i=0;i<4*N;i++) if(bigger(power2[i],start)>=0) break;

        if(eq(power2[i],start)){
            if(save[i] != NULL){
                copy(output, save[i]);
                return;
            }
            saveId = i;
        }
        i--;
    int* s_p2 = getNewOne(); minus(start,power2[i],s_p2);
    int* o1 = getNewOne(), * o2 = getNewOne(), * o3;
        f(power2[i], o1);
        f(s_p2, o2);
        o3 = o2;

    int* head = getNewOne(); minusn(power2[i],1,head);
    int* nail = getNewOne(); minus(power2[i], s_p2, nail);
    int* tri = output; qiuhe(nail,head,tri); //(power2[i]-1 + power2[i]-o2) * (power2[i]-o2) / 2;

    free(head); free(nail);

    sum(tri, o1, tri);
    sum(tri, o2, tri);
    sum(tri, o3, tri);

    free(o1); free(o2); free(o3);
    if(saveId != -1){
        save[saveId] = getNewOne();
        copy(save[saveId], output);
    }
}
char sss[N];
int main()
{
    int i,j,k;
    power2[0] = getNewOne();
    setn(power2[0],1);
    for(i=1;i<4*N;i++){
        power2[i] = getNewOne();
        timen(power2[i-1],2,power2[i]);
        //print(power2[i]);
    }

    int* start =getNewOne();
    if(0){
        gets(sss);
        int n = strlen(sss);
        for(i=1;i<=n;i++) start[i]=sss[n-i]-'0';
        start[0]=n;
        sumn(start,1,start);
    }
    setn(start,1000000);

    int* output = getNewOne();
    f(start, output);
    print(output);
    //print(start);
    //printf("%d\n",-11/10);
    return 0;
}
#包括
#包括
#包括
#定义最大值(a,b)((a)>(b)?(a):(b))
#定义真1
#定义false 0
#定义N 50
#定义调试1
int*power2[4*N];
int*保存[4*N];
int tmp_n1[2*N],tmp_n2[2*N];
#定义修剪(a,n)do{\
int n=n\
对于(i=1;i=10){\
a[i+1]+=a[i]/10\
a[i]=10\
} \
而(a[n_+1]!=0)n_++\
a[0]=n\
}而(0)
#定义trim2(a,n)do{\
int n=n\
对于(i=n_;i>=1;i--)如果(a[i]0)n_--\
a[0]=n\
}而(0)
#定义打印(a)do{\
int i1\
如果(a[0]==0)putchar('0')\
对于(i1=a[0];i1>=1;i1--)putchar(a[i1]+'0')\
putchar('\n')\
}而(0)
#定义复制(dest,src)memcpy(dest,src,2*N*sizeof(int))
#定义clear(src)memset(src,0,2*N*sizeof(int))
无效和(int*a,int*b,int*c){
int i;int n=max(a[0],b[0]);
对于(i=1;i 1)返回false;
返回a[1]==n;
}
void f(int*开始,int*输出){
如果(调试){
printf(“输入:”);
打印(开始);
}
if(eqn(start,0)| | eqn(start,1)| | eqn(start,2)){setn(output,0);return;}
int saveId=-1;
int i;
对于(i=0;i=0)中断;
if(等式(功率2[i],启动)){
如果(保存[i]!=NULL){
复制(输出,保存[i]);
返回;
}
saveId=i;
}
我--;
int*s_p2=getNewOne();减号(开始,power2[i],s_p2);
int*o1=getNewOne(),*o2=getNewOne(),*o3;
f(幂2[i],o1);
f(s_p2,o2);
o3=o2;
int*head=getNewOne();minsn(power2[i],1,head);
int*nail=getNewOne();减号(power2[i],s_p2,nail);
int*tri=output;qiuhe(钉子、头、tri);/(power2[i]-1+power2[i]-o2)*(power2[i]-o2)/2;
自由(头部);自由(指甲);
总和(tri,o1,tri);
总和(tri,o2,tri);
总和(tri,o3,tri);
游离(o1);游离(o2);游离(o3);
如果(saveId!=-1){
save[saveId]=getNewOne();
复制(保存[saveId],输出);
}
}
char-sss[N];
int main()
{
int i,j,k;
power2[0]=getNewOne();
setn(power2[0],1);

对于(i=1;i事实上,所有问题基本上都是代码问题


我将同一个指针传递给free(void*)函数两次。

事实上,所有问题基本上都是代码问题

我将同一个指针传递给free(void*)函数两次