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