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