Portál AbcLinuxu, 26. dubna 2024 05:07


Dotaz: gcc - chyba v pointer aritmetice (asi align)

21.3.2008 13:52 vice | skóre: 21
gcc - chyba v pointer aritmetice (asi align)
Přečteno: 160×
Odpovědět | Admin
Zdravím všechny, mám problém s pointer aritmetikou v gcc:

pid_t *pid_aaa;
pid_t *pid_bbb;

void * pamet = malloc(xxxx);
....
pid_aaa = (pid_t*)pamet;
pid_bbb = (pid_t*)(pid_aaa + sizeof(pid_t));

za běhu je sizeof(pid_t) = 4, ale rozdíl mezi pid_aaa a pid_bbb je 0x10. Předpokládám, že problém je v zarovnání (align) proměných, netušíte prosím, kudy z toho ven?

Není důležité co se stane, ale jak se to vysvětlí.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.3.2008 13:55 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
Rozbalit Rozbalit vše Re: gcc - chyba v pointer aritmetice (asi align)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Kudy z toho ven? Přečti si něco o pointerové aritmetice, doporučuju Herouta. Když k pointeru přičteš jedničku, bude ukazovat na následující prvek, ne na následující adresu – tj. posune se o velikost typu na který ukazuje.
Užívej dne – možná je tvůj poslední.
21.3.2008 13:58 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: gcc - chyba v pointer aritmetice (asi align)
Odpovědět | | Sbalit | Link | Blokovat | Admin

To chování je naprosto správné. Uvědomte si, že je-li p typu T* a n celočíselný výraz, pak p+n ukazuje o n položek typu T dále, tj. o n*sizeof(T) bytů vyšší adresu. V daném případě tedy 4x4, což je 16.

21.3.2008 14:06 vice | skóre: 21
Rozbalit Rozbalit vše Re: gcc - chyba v pointer aritmetice (asi align)
Díky,

vím to, jen jsem byl zahleděný do kódu pro výpočet velikosti alokace, kde samozřejmě musím použít sizeof(). Už se stydím a jdu tlouct hlavou o zeď.

Ještě jednou omluva za stupidní dotaz ...

Není důležité co se stane, ale jak se to vysvětlí.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.