Tajemná zákoutí jazyka C.
Josef Štengl
ok1ced na nagano.cz
Pátek Leden 8 12:46:16 CET 2016
# pole charů o velikosti FOOLEN
char foo[FOOLEN]
# pole ukazatelů na char o velikosti FOOLEN
char * foo[FOOLEN]
# ukazatel na pole charů o velikosti FOOLEN
char (*foo)[FOOLEN]
-- příklad ze specifikace C když se na to chvilku koukáte, jde to pochopit :-).
Je to příklad na pole s varialbe lenght array
EXAMPLE
Pointer arithmetic is well defined with pointers to variable length array types.
{
int n = 4, m = 3;
int a[n][m];
int (*p)[m] = a; // p == &a[0]
p += 1; // p == &a[1]
(*p)[2] = 99; // a[1][2] == 99
n = p - a; // n == 1
}
If array a in the above example were declared to be an array of known constant size, and pointer p were
declared to be a pointer to an array of the same known constant size (pointing to a), the results would be
the same.
Dne 8.1.2016 v 11:21 Jiří Nesvačil napsal(a):
> 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
>
> _______________________________________________
> 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