Dotaz C

Pavel Troller patrol na sinus.cz
Neděle Leden 7 19:58:44 CET 2018


Zdravím,
  ano, já jsem k témuž názoru přišel také. Je to zjevná chyba, samozřejmě
v té původní aplikaci tam přiřazovali jiný, dynamický text, ale díky tomu,
že použili snprintf() a udali předpokládanou délku (která byla totožná
s dimenzí toho pole), tak to z principu nemohlo přetéci nikdy a bylo to 
jen mrháním paměti a drážděním kompilátoru :-).
  Ale chápu kolegu Mráze, protože v tom místě se pracuje většinou s pointery
a tak ta hvězdička člověku vypadne z ruky jen to fikne :-). Jen je divné,
že to nezrevidovali, když taky museli vidět ten warning. Jenže ona tam
byla ještě spousta jiných (různé pozapomínané "const" u parametrů při
volání funkcí apod.), o kterých se ví, že jsou celkem neškodné, tak se tam
toto mezi nimi ztratilo.
  U C mi trošku vadí jistá nečitelnost té konstrukce. Chvilku mi trvalo
usoudit, zda char *str[80] je jeden pointer na vektor charů o 80 prvcích
(který by ale nebyl nikde alokován a tedy by to samozřejmě spadlo), nebo
pole 80 pointerů na char (což je skutečnost). Napadlo mne intuitivně
zvýšit čitelnost tímto zápisem: char (* str)[80], čímž chci tedy říci, že
to má být vektor 80 ukazatelů na char, a cvičně to zkusil zkompilovat.
Prošlo to! Sice tam byl zase podobný warning, jako když tam nebyly závorky,
jen hvězdička, ale nefunguje to! Nyní dostávám výsledek (null) místo
stringu, ale necrashne to. Co jsem to prosím vás vyrobil za hrůzu :-) ? Já
v C občas programuji, ale nejsem programátor na plný úvazek a stačí mi
relativně běžné konstrukce a takovéhle věci obvykle nepoužívám :-).
  Zdraví Pavel

> > mě se to taky stává když alokuji prostor pro c-string jednou na haldě a
> podruhé na zásobníku
> 
> Ale tady se alokuje jenom na zasobniku....
> Zasobnik v tom prikladu nepretece diky tomu, ze se ten kratky textik do
> toho bufferu vejde.
> 80 x pointer na char = bud 160 a nebo 320 bajtu (dle architektury 16/32
> bit).
> strlen("Nazdar ahoj\n") je vyrazne mene...
> -mv
> 
> 
> 2018-01-07 14:05 GMT+01:00 Miroslav Mraz <mrazik na volny.cz>:
> 
> > To není blbý dotaz. Patrně jde o překlep, mě se to taky stává když alokuji
> > prostor pro c-string jednou na haldě a podruhé na zásobníku. Opravte to
> > tak, jak to považujete za správné.
> >
> > Mrazík
> >
> > Dne 7.1.2018 v 13:39 Pavel Troller napsal(a):
> >
> > Zdravím,
> >>    při neděli malý blbý dotaz... Zase jednou typická C vlastnost typu
> >> "ať je tam hvězdička nebo není, dělá to totéž :-)".
> >>
> >> Mějme tento example:
> >>
> >> #include <stdio.h>
> >> #include <string.h>
> >>
> >> int main(void) {
> >>          char str[80];
> >>          snprintf(str,80,"%s","Nazdar ahoj\n");
> >>          printf("%s",str);
> >>          return 0;
> >> }
> >>
> >> Vše jasné, funguje jak má.
> >>
> >> A nyní změníme řádek s deklarací str na:
> >>         char *str[80];
> >>
> >> Kompilátor sice warninguje o nesprávném typu 1. parametru pro snprintf,
> >> že to má být char * a je to char **, ale zkompiluje to, binár je stejně
> >> velký a stejně funkční :-). Nicméně disassembly kódu ukazuje, že je to
> >> zkompilované mírně odlišně.
> >>    Ptám se proto, že tu cosi kompiluji (není to můj produkt), hlásí mi
> >> to ten warning, tak jsem to začal zkoumat, mají tam tu druhou možnost
> >> s hvězdičkou, tak uvažuji, proč ji tam mají a zda to mám přepsat na tu
> >> první, jak bych to udělal já :-).
> >>
> >> Zdraví Pavel
> >>
> >> _______________________________________________
> >> HW-list mailing list  -  sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> >>
> >> _______________________________________________
> > HW-list mailing list  -  sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> >

> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list