Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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: Pointery a pád programu/OS

Aktivity
Avatar
Daniel Bršťák:8.11.2020 8:12

Dobrý deň. Potreboval by som poradiť ohľadom bezpečnosti používania pointerov. Práve sa učím pracovať s pointermi, no a problém je v tom že nejako podozrivo často mi padá nielen visual studio/c4droid ale niekoľko krát sa mi už aj sám vypol/reštartoval windows aj android. Neviem v čom je problém, Pc mi problémy nerobí, ani telefón ale zvyknú blbnúť ako náhodou keď programujem čosi s pointermi. Na nete som sa dočítal že je možné nevhodnou manipuláciou s pointermi zmeniť data v pamäti ktorú používa OS. chcem sa opýtať či existujú nejaké všeobecné rady ako sa vyhnúť pádu programu. V knihách Programovací jazyk C od R&K a Učebnice jazyka C od Herouta toho veľa nie je, max. Že si mám na to dávať pozor. :-)

 
Odpovědět
8.11.2020 8:12
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Daniel Bršťák
DarkCoder:8.11.2020 14:39

Ukazatele jsou mocný nástroj, avšak nebezpečný v rukách těch kdo je neovládá.

Ano, nevhodná manipulace s ukazateli může způsobit špatnou funkčnost nebo i pád programu (v tom lepším případě). K tomu může dojít pokud se pracuje s neplatným ukazatelem (takovým, který na nic neukazuje) nebo s ukazatelem, který ukazuje do paměti která ale není uživatele. Přepsáním této paměti může dojít k výše uvedených chybám. To nastává zejména při práci s poli, kde se k prvkům pole přistupuje nepřímo pomocí ukazatele a při práci s dynamicky alokovanou pamětí, která byla dříve uvolněna.

Zde je několik obecných rad jak správně používat ukazatele:

  • každý ukazatel, který neinicializujeme adresou platného objektu, nastavujeme na NULL.
  • každý ukazatel, který na nic neukazuje (například byla uvolněna paměť pomocí free), nastavujeme na NULL.
  • před použitím jakéhokoli ukazatele je třeba ověřit, že ukazatel je platný (není NULL). To je nutné zejména tehdy, kdy dynamicky alokujeme paměť pomocí funkcí malloc() nebo calloc(). Alokace paměti není automatická a může selhat.
  • při práci s poli, k jehož prvkům se přistupuje nepřímo pomocí ukazatele, být obezřetný, zda-li se neukazuje na prvek mimo toto pole. Překladač takovéto chyby nezachytí.
  • znát rozdíl mezi (*p)++ a *p++ popř. (*p)-- a *p--. Tedy vědět, kdy se inkrementuje popř. dekrementuje prvek a kdy ukazatel.
  • nepoužívat nullový ukazatel nebo ukazatel, který na nic neukazuje. Zejména chceme-li nastavit hodnotu proměnné nepřímo pomocí ukazatele.
  • před použitím obecného ukazatele (void *) je třeba tento ukazatel přetypovat na správný typ.
  • být obezřetný při práci s vícenásobnou dereferencí, obtížně se sleduje její činnost.
  • být obezřetný při práci s ukazateli předávané jako parametry funkcí.
  • být obezřetný při typových konverzích
  • vhodně si popisovat identifikátor ukazatele
  • všímat si varovných hlášení vypsané překladačem
  • umět správně použít ukazatele a přesně vědět co co dělá.

Dále se lépe poradí a odhalí chyba, když přiložíš úryvek kódu, ve kterém ukazatele používáš.

Editováno 8.11.2020 14:40
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
8.11.2020 14:39
"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 2 zpráv z 2.