C, ukazatele a realloc

HackForum

C, ukazatele a realloc#
link (bude jenom mesic): [link]
Potreboval bych poradit s jednou chybičkou. Ve fkci prazdna () mam pointer na pole buffer. Pro pole si alokuju trosku pameti. Pointer predam fkci horizontal (...*buffer []...)jako &buffer. V teto fkci s polem nic nedelam, jenom ho predam do fkce pridej (...*buffer []...) jako buffer. V teto fkci se pole pokusim realokovat, ale:

realokace buď neproběhne, nebo se program zastaví uvnitř realloc (), to nevím. Vím jenom, že program nic nedělá jako zaseklý v nekonečnej smyčce a Watson ani debugger integrovaný v Dev-C++ se nehlásí.
Chtěl bych poděkovat Drekinovi, který mi s tímto hodně pomohl (ale furt mi to nejde :)). Díky všem, kteří zkousnou můj prasácký kód a všem, který najdou nějakou chybičku, ať už o ní vim nebo ne.
(odpovědět)
NyQ | E-mail | Website13.12.2008 21:36
re: C, ukazatele a realloc#
called verticaly
realloc
--15759-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--15759-- si_code=1; Faulting address: 0x12; sp: 0x625D7E68

valgrind: the 'impossible' happened:
Killed by fatal signal
==15759== at 0x3802347A: (within /usr/lib/valgrind/x86-linux/memcheck)
==15759== by 0x38023B21: (within /usr/lib/valgrind/x86-linux/memcheck)
==15759== by 0x380027E9: (within /usr/lib/valgrind/x86-linux/memcheck)
==15759== by 0x38039085: (within /usr/lib/valgrind/x86-linux/memcheck)
==15759== by 0x3804D2C8: (within /usr/lib/valgrind/x86-linux/memcheck)

sched status:
running_tid=1

Thread 1: status = VgTs_Runnable
==15759== at 0x4006E8C: realloc (in /usr/lib/valgrind/x86-linux/vgpreload_memch
eck.so)
==15759== by 0x8048BE1: pridej (in /home/vojta/C++/Nyq)
==15759== by 0x8048FE7: horizontal (in /home/vojta/C++/Nyq)
==15759== by 0x8049347: prazdna (in /home/vojta/C++/Nyq)
==15759== by 0x8049907: priprav (in /home/vojta/C++/Nyq)
==15759== by 0x8049CE0: main (in /home/vojta/C++/Nyq)

chyba nastane určitě v realloc(), proč, to je těžké objevit ;)

myslím, že si_code=1 ve výpisu valgrindu znamená, že zapisuješ do oblasti paměti, kterou nemáš namapovanou...čímž asi moc nepomůžu, já vím ;)
(odpovědět)
mr.Crow. | 213.211.34.*14.12.2008 16:03
re: C, ukazatele a realloc#
nojo..ty se jmenuješ Vojta? :)
já myslim, že je chyba v realloc, ne? když to dál nejde..zavolám realloc a tim to všechno konči..
(odpovědět)
NyQ_nolog | 77.48.72.*14.12.2008 16:15
re: C, ukazatele a realloc#
At ziji programovaci jazyky s automatickou spravou pameti, garbage collectorem a bez pointeru :-D
|
|
V

----------
public static void main(String args[]){
 throw new UnsupportedOperationException("Not implemented!");
}


(odpovědět)
pr0ph3t14.12.2008 16:33
re: C, ukazatele a realloc#
at ziji lidi co maj na poradny hardware

----------
Harvie's blog: [link] g33k-shop: [link] fs: [link]
Registered GNU/LINUX user #468114 [link]

(odpovědět)
Harvie | E-mail | Website | ICQ 28378297814.12.2008 20:55
re: C, ukazatele a realloc#
No, je videt, ze jsi asi v zivote nevidel poradnou aplikaci v Jave. Rozdil oproti jinym jazykum je minimalni a s kazdou nasledujici verzi Javy se jeste snizuje. Navic - rychlost neni vzdy prioritou. A v takovych pripadech je hole silenstvi to delat v necem zastaralem.

----------
public static void main(String args[]){
 throw new UnsupportedOperationException("Not implemented!");
}


(odpovědět)
pr0ph3t16.12.2008 1:35
re: C, ukazatele a realloc#
Je sice pekne, ze JAVA je nej a je na vse, ale na veci na urovni HW se nic C nevyrovna.

A co bude s Javou za 20 let ? Viz clanek na PCTuningu
(odpovědět)
BLR | 213.192.9.*18.12.2008 21:23
re: C, ukazatele a realloc#
o dlouhé večery s gdb a valgrindem se kvůli nějakému pokroku připravit nenechám! :o)
(odpovědět)
mr.Crow. | 213.211.34.*14.12.2008 21:50
re: C, ukazatele a realloc#
Harvie, pr0ph3t: to mi sem netahejte :)

ta chyba může nastat buď proto, že chci moc :)
nebo proto, že to chci někam do *

jinak když jsem alokoval víc, tak mi to uvízlo v dlouhej smyčce a nakonec to stejně chcíplo -> mám tam chybu v obsahu toho bufferu..musim ho cistit
(odpovědět)
NyQ | E-mail | Website14.12.2008 21:23
re: C, ukazatele a realloc#
zkusil jsem si napsat vlastní náhradu realloc(), chyba byla naprosto stejná (malloc() hlásí "memory corruption")...zkusil jsem ale v každém volání mé náhrady realloc() alokovat 100x více paměti, než o kolik bylo žádáno a chyba zmizela (ale stejně jsem časem dostal nějaký segfault, valgrind mi hlásí, že často hrabeš v nealokované paměti - být tebou, nainstaluju si valgrind a všechny nesrovnalosti opravím ;))

malloc(): memory corruption nastává prý v případě:

* Writing beyond the end of a memory block obtained via malloc
or realloc.

* Writing/reading memory that has been released with free().

...takže doufám, že moje domněnky jsou správé, abych nemystifikoval.
(odpovědět)
mr.Crow. | 213.211.34.*14.12.2008 21:33
re: C, ukazatele a realloc#
no když jsem si řek najednou o všechnu paměť, tak [link]
valgrind, používám hlavně widle..ale když si najdu nějaký ide pro linux,...asi na linuxsoftu nebo ábíčku...
jestli jsem to pochopil, tak malloc zapisuje někam, kam nemá? může to souviset s *buffer? myslím, že jsem ho předal dobře, viz test na [link] porovnejte to někdo, mě se to zdá stejný...
(odpovědět)
NyQ | E-mail | Website15.12.2008 17:16
re: C, ukazatele a realloc#
podle mě zapisuješ někde jinde v programu něco někam blbě, do paměti, kterou nemáš namapovanou a kvůli tomu malloc později selže (asi mu nějak vadí mapovat paměť, která je "popsaná" chybným pointerem, což moc dobře pořádně nechápu proč, proto doufám, že tento thread navštíví někdo zkušenější a poradí)
(odpovědět)
mr.Crow. | 213.211.34.*15.12.2008 20:15
re: C, ukazatele a realloc#
pole A1, odkryt -> radek 141 if ((*buffer = (unsigned *) realloc ( (void *)*buffer , (*p_end_buff + QUANTUM) * sizeof (unsigned)))== NULL) return PAMET; zpusobil SEGFAULT kvuli Invalid pointer. zrejme buffer neni platny pointer na alokovany blok pameti.
(odpovědět)
gfd | 77.104.253.*16.12.2008 16:45
re: C, ukazatele a realloc#
jo, s *buffer se někde počítá špatně, protože pokud provedu realloc() bez kopírování starého bloku paměti na nově alokované místo + odstraním uvolnění starého bloku paměti (tzn. realloc() vůbec nepracuje s ukazatelem, předaným jako první parametr), chyba zmizí (ale dostanu segfault někde jinde, což je asi známka toho, že se s tím ukazatelem pracuje špatně..nebo je to následek chybné práce mého upraveného realloc(), nevím...)
(odpovědět)
mr.Crow. | 213.211.34.*16.12.2008 17:05
re: C, ukazatele a realloc#
to me taky napadlo, proto ten [link] myslim, že to je to samý?
(odpovědět)
NyQ | E-mail | Website16.12.2008 17:17
re: C, ukazatele a realloc#
Vyzkousej si praci s pointery a poli na necem mensim, cele to mas divoke. Taky se vyhni tem tunam dereferenci, pak neni divu, ze se v tom ztracis.

(odpovědět)
prc | 213.211.51.*18.12.2008 15:52

Zpět
Svou ideální brigádu na léto najdete na webu Ideální brigáda
 
 
 

 
BBCode