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