chybna alokace pameti
Jan Eisner
eisner na math.cas.cz
Čtvrtek Prosinec 8 15:19:18 CET 2005
DD, prosim o radu, co delam spatne?
(snad to neni prilis dlouhy popis chyby)
Beh programu konci hlaskou Segmentation fault.
v programu rekneme cml.c
alokuji nejprve nekolik matic odkazu na double pomoci
double **aM;
double **aF;
double **aPM;
double **aPF;
double **aSM;
double **aSF;
double **aSFM;
...a pak (kraceno) postupne mallocuji pomoci
if (verbose = 1)
{ printf("Alokuji aM \n"); }
alokujDD = (aM = (double **) malloc(SideLength*sizeof(double *)));
if (alokujDD == NULL)
{ printf("Out of dynamic memory! \n");
return;
}
else
{ printf("%p\n",alokujDD); }
for (i=0; i<SideLength; i++)
{
alokujD = (aM[i] = (double *) malloc(SideLength*sizeof(double)));
if (alokujD == NULL)
{ printf("Out of dynamic memory! \n");
return;
}
else
{ printf("%4i,%p\n",i,alokujD); }
}
...pak zkontroluji ukazatele (ok)
...pak se na aPF nasaha
...a pak pred fatalnim (prvnim) pouzitim pole aPF
jeste jednou vypisu, kam ktery ukazatel ukazuje
(a to uz se hodnota necim prepise - viz vypis gdb dole)
Chyba se mi projevuje na strojich
i386 s FC2
i386 s Centos4.2
ale ne na x86_64 s FC3_64,
vsude jsou gcc a knihovny z prislusnych distribuci (gcc v3.4.4),
zadna vylepseni.
Mate nekdo napad? Diky!
Honza
-------------------------------------------
[...]$ gdb
GNU gdb Red Hat Linux (6.0post-0.20040223.19rh)
Copyright 2004 Free Software Foundation, Inc.
Breakpoint 1, main (argc=24, argv=0xbff88c04) at cml.c:1122
1122 initVar();
Kontroluji pole
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
(nil)
Alokuji pole
Alokuji aM
0x83841e0
0,0x8384210
1,0x8384268
2,0x83842c0
3,0x8384318
4,0x8384370
5,0x83843c8
6,0x8384420
7,0x8384478
8,0x83844d0
9,0x8384528
Alokuji aF
0x8384580
0,0x83845b0
1,0x8384608
2,0x8384660
3,0x83846b8
4,0x8384710
5,0x8384768
6,0x83847c0
7,0x8384818
8,0x8384870
9,0x83848c8
Alokuji aPM
0x8384920
0,0x8384950
1,0x83849a8
2,0x8384a00
3,0x8384a58
4,0x8384ab0
5,0x8384b08
6,0x8384b60
7,0x8384bb8
8,0x8384c10
9,0x8384c68
Alokuji aPF
0x8384cc0
0,0x8384cf0
1,0x8384d48
2,0x8384da0
3,0x8384df8
4,0x8384e50
5,0x8384ea8
6,0x8384f00
7,0x8384f58
8,0x8384fb0
9,0x8385008
Alokuji aSM
0x8385060
0,0x8385090
1,0x83850e8
2,0x8385140
3,0x8385198
4,0x83851f0
5,0x8385248
6,0x83852a0
7,0x83852f8
8,0x8385350
9,0x83853a8
Alokuji aSF
0x8385400
0,0x8385430
1,0x8385488
2,0x83854e0
3,0x8385538
4,0x8385590
5,0x83855e8
6,0x8385640
7,0x8385698
8,0x83856f0
9,0x8385748
Alokuji aSFM
0x83857a0
0,0x83857d0
1,0x8385828
2,0x8385880
3,0x83858d8
4,0x8385930
5,0x8385988
6,0x83859e0
7,0x8385a38
8,0x8385a90
9,0x8385ae8
Kontroluji pole
0x83841e0
0x8384580
0x8384920
0x8384cc0
0x8385060
0x8385400
0x83857a0
SideLength=10
Kontroluji pole
0x83841e0
0x8384580
0x8384920
0x2d353030
0x8385060
0x706f70
0x83857a0
Program received signal SIGSEGV, Segmentation fault.
0x0804a7fb in Psousedu () at cml.c:855
855 aPF[i][j] = -dt*mF*aF[i][j];
(gdb) print aF[0][0]
$1 = 0
(gdb) print aPF[0][0]
Cannot access memory at address 0x2d353030
(gdb) print dt
$2 = 1
(gdb) print mF
$3 = 0.10000000000000001
(gdb)
pri kontrole /proc/<cislo procesu>
(pochopitelne) v seznamu adres 0x2d353030 ani 0x706f70 nejsou
diky!
Další informace o konferenci Linux