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