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*)函数两次