Tajemná zákoutí jazyka C.

Miroslav Mraz mrazik na volny.cz
Pátek Leden 8 10:52:54 CET 2016


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


Další informace o konferenci Hw-list