NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 4 - Makra v jazyce C

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
DarkCoder
Člen
Avatar
Odpovídá na coells
DarkCoder:14. května 19:52

Na proměnnou j se nikdy nemusím odkázat a stejně vím, kde je a mám na ni pointer (v tom lepším případě, v tom horším mám pouze pointer).

const int i = 1;
const int j = 2;

int *pj = &i + 1;

Toto není pravda a kód je chybně.

1. Ukazatel mimo platný rozsah

Ukazatelová aritmetika v C se smí používat pouze v rámci jednoho pole (nebo na ukazatel ukazující na jeden prvek za koncem pole, což je výslovně povoleno standardem).

Jelikož i není pole způsobí zápis

int *pj = &i + 1;

nedefinované chování. pj ukazuje na paměť bez záruky, že je platná.

2. Pokus o obcházení const pomocí ukazatele

Proměnné i a j jsou const. Ukazatel pj je však typu int *, ne const int *. To znamená, že se může (ačkoliv by neměl) použít k modifikaci hodnoty na dané adrese. Pokud by pj ukazoval zpět na i, může dojít k narušení const kvalifikátoru. kompilátor hodí varování C4090.

3. Záměna s polem – kód je zavádějící

V jazyce C není zaručeno, že j bude v paměti hned za i. Optimalizátor může proměnné uložit kamkoli, v libovolném pořadí.

4. Nebezpečné čtení nebo zápis z pj

Pokud se později použije *pj (např. printf("%d", *pj);), dojde k přístupu na paměť, která není platná. Může se jednat o jakoukoli hodnotu, může dojít k pádu programu nebo neviditelné logické chybě.

Odpovědět
14. května 19:52
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 21.