Re: Tajemná zákoutí jazyka C.
Jiří Nesvačil
nesvacil na posys.eu
Pátek Leden 8 11:21:15 CET 2016
Rekl bych, ze toto se rozlozi:
struct strange {
char (*foo) [FOOLEN]; // Proč ???
};
struct strange {
char *foo [FOOLEN];
};
Dale pak skoro ekvivaletne
struct strange {
char **foo;
};
Ta definice delky muze souviset s definici v pameti. Pokud kompiler nevi jak to je dlouhe, tak se z toho nedaji delat tabulky, ale implementuje se to jako pole odkazu. Kdyz tomu dam delku, tak by to kompiler mohl delat jako tabulku s jasne danym
rozmerem a ne jako pole pointeru.
Jirka
Dne 8. 1. 2016 v 10:52 Miroslav Mraz napsal(a):
> V libmad jsem narazil na podivnou konstrukci :
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> #define FOOLEN 20
> // pomocná proměnná
> static char pole [FOOLEN];
>
> struct strange {
> char (*foo) [FOOLEN]; // Proč ???
> };
> void test_strange (struct strange * ps) {
> printf ("strange size = %d\n", sizeof (struct strange));
> ps->foo = & pole; // Tohle je pro mne nečitelné
> // A takhle s tím dál pracují...
> strcpy (*ps->foo, "blabla...");
> printf ("strange: \"%s\"\n", *ps->foo);
> }
> // Takhle bych to asi udělal čitelněji
> struct normal {
> char * foo;
> };
> void test_normal (struct normal * ps) {
> printf ("normal size = %d\n", sizeof (struct normal));
> ps->foo = pole; // resp. &pole[0]
> strcpy (ps->foo, "...blabla");
> printf ("normal : \"%s\"\n", ps->foo);
> }
> // Obě funkce test_xxx produkují stejný kód
> int main (void) {
> struct strange s;
> test_strange (&s);
> struct normal n;
> test_normal (&n);
> return 0;
> }
>
> Může mi někdo vysvětlit proč tam mají ten divný ukazatel ? Jak se vůbec taková konstrukce čte ? Pole to není, nealokuje se pro něj paměť, protože obě struktury strange i normal mají stejnou délku. Připadá mi to, že je to jen pro zmatení nepřítele.
> Ale zmátlo mě to řádně, to se musí uznat.
>
> Mrazík
> _______________________________________________
> 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