error message:
Program stopped at 0x77dc2f6a
It stopped with signal SIGSEGV, Segmentation fault.
(gdb) Using the running image of child thread 2120.0x20d8.
Program stopped at 0x77dc2f6a
It stopped with signal SIGSEGV, Segmentation fault.
complier: C-Free
here is my codes
#include<stdio.h>
using namespace std;
/*
128m
n: [6,40] k: [1,6]
n*k: 0.9k
*/
struct BN
{
char num[160];
int len;
};
int len, num_k;
BN number;
BN* map;
bool* isC;
void BN_get(BN* bn, int len);
void BN_show(BN* bn);
void BN_clear(BN* bn);
// compare
bool BN_gt(BN* a, BN* b);
// count
void BN_mul(BN* a, BN* b, BN* c, int aS, int aE, int bS, int bE);//c = a+b
void f(int n, int k);
int main()
{
int i, j;
char c;
scanf("%d %d", &len, &num_k);
BN_get(&number, len);
map = new BN[len*num_k];
isC = new bool[len*num_k];
for(i=0;i<len*num_k;++i)
isC[i]=false;
// init
for(i=0; i<len; ++i){
//map[i,0]
for(j=0;j<=i;++j){
map[i*num_k].num[j] = number.num[j];
}
map[i*num_k].len = i+1;
isC[i*num_k] = true;
}
//printf("");//case1
f(len-1, num_k);
BN_show(&map[len*num_k]);
return 0; // line 63
}
void BN_get(BN* bn, int len)
{
int i;
char c;
c = getchar();
for(i=len-1;i>=0;--i){
scanf("%c", &c);
if(i>159 || i<0)printf("OUT\n");//debug
bn->num[i] = c-'0';
}// line 85
bn->len = len;
}
void BN_show(BN* bn)
{
int i, len=bn->len;
for(i=len-1;i>=0;--i){
if(i>159 || i<0)printf("OUT\n");//debug
printf("%d", bn->num[i]);
}
}
void BN_clear(BN* bn)
{
int i;
for(i=0;i<160;++i){
if(i>159 || i<0)printf("OUT\n");//debug
bn->num[i]=0;
}
bn->len = 0;
}
bool BN_gt(BN* a, BN* b)
{
int i, an, bn;
int alen = a->len, blen=b->len;
// if a>b
if(blen>alen){
return false;
}else if(alen==blen){
for(i=alen-1; i>=0; --i){
if(i>159 || i<0)printf("OUT\n");//debug
an = a->num[i];
bn = b->num[i];
if(an>bn)
return true;
if(an<bn)
return false;
}
return false;
}
return true;
}
void BN_mul(BN* a, BN* b, BN* c, int aS, int aE, int bS, int bE)
{
int i, j, k, l;
char *an=a->num, *bn=b->num, *cn=c->num;
BN_clear(c);
for(i=bS, k=0; i<=bE; ++i, ++k){
for(j=aS,l=k; j<=aE; ++j,++l){
if(i>159 || i<0)printf("OUT\n");//debug
if(l>159 || l<0)printf("OUT\n");//debug
if(j>159 || j<0)printf("OUT\n");//debug
if(l+1>159 || l+1<0)printf("OUT\n");//debug
cn[l] += bn[i]*an[j];
cn[l+1] += cn[l]/10;
cn[l] %= 10;
}
}
if(l>159 || l<0)printf("OUT\n");//debug
if(cn[l]==0)
c->len = l;
else
c->len = l+1;
}
void f(int n, int k)
{
int i, up=n-1-(k-2);
BN max, a, b;
BN_clear(&max);
for(i=0;i<up;++i){
// b = f(n-1-i, k-1)
if(!isC[(n-1-i)*num_k+k-1])
f(n-1-i, k-1);
b = map[(n-1-i)*num_k+k-1];
// a = f(n-1-i, k-1) x num(n-i, n);
BN_mul(&b, &number, &a, 0, b.len-1, n-i, n);
// max
if(BN_gt(&a, &max))
max=a;
}
isC[n*num_k+k] = true;
map[n*num_k+k] = max;
}
BN_xxx() is some op of big number
In the end of main, here is line of code
"//printf("");//case1"
If i don't printf(), i will received the wrong message.
If i printf(), even print empty, it will run without wrong.
I set lots of check, and it seens that never out of range.
I guess the problom is about IO stream, but i don't know what the happen.
I run in msvs again. Here is the stack
name language
ntdll.dll!00007ffbc22d4cfa() unknown
ntdll.dll!00007ffbc22dc806() unknown
ntdll.dll!00007ffbc22dcad1() unknown
ntdll.dll!00007ffbc2279a55() unknown
ntdll.dll!00007ffbc21f6db5() unknown
ntdll.dll!00007ffbc21f2b55() unknown
ucrtbased.dll!00007ffb6a341716() unknown
ucrtbased.dll!00007ffb6a3414cd() unknown
ucrtbased.dll!00007ffb6a34455f() unknown
ucrtbased.dll!00007ffb6a3a622b() unknown
ucrtbased.dll!00007ffb6a368e15() unknown
ucrtbased.dll!00007ffb6a3857c6() unknown
ucrtbased.dll!00007ffb6a37c085() unknown
ucrtbased.dll!00007ffb6a37c27b() unknown
ucrtbased.dll!00007ffb6a37cbd7() unknown
ucrtbased.dll!00007ffb6a39ea3b() unknown
ConsoleApplication1.exe!_vfprintf_l(_iobuf * const _Stream, const char * const _Format, __crt_locale_pointers * const _Locale, char * _ArgList) line 644 C++
ConsoleApplication1.exe!printf(const char * const _Format, ...) line 958 C++
ConsoleApplication1.exe!BN_show(BN * bn) line 85 C++
ConsoleApplication1.exe!main() line 63 C++