( Chain-Q | 2024. 04. 20., szo – 14:52 )

Ez az eszmefuttatás egész addig érvényes, amíg rá nem jössz, hogy a struct-ok viszont érték szerint adódnak át, ergó lemásolódnak és működik rájuk a sizeof... Sőt még cím szerinti átadás esetén is megy. Semmi oka nincs, hogy tömbökre, legalábbis konstans méretűekre miért ne tudna ugyanígy működni - azt leszámítva, hogy a nyelv nem így működik - azaz szarul. :) Nem különböztet meg konstans méretű és dinamikus méretű tömböket, és hiába ismert egy statikus méretű tömböd mérete, valamiért ez az infó elveszik paraméterátadáskor. Az arr + 5 példa számomra teljesen rossz, és pont annak a példája, hogy a C olyasmit is megenged amit nem kéne - az "arr + 5" számomra egy 1337 elemű tömböt kéne hogy jelentsen attól a címtől kezdve, hiszen az van a típusban - de nem azt fog. Nyilván így nem is tud működni a sizeof(), ezt is értem. De pont ez a problémám a C-vel, hogy _szerintem_ ez így értelmetlen, de ezt elmagyarázni valakinek aki ebben él olyan, mint egy német vagy angol nyelvi beszélőnek hogy a nemre tagolt személyes névmásoknak kb. semmi értelme és lehet enélkül létezni, sőt... Jót tesz mentálisan. :)

Struct-os példa:

#include "stdio.h"

typedef struct {
    char arr[1337];
} struct_t;
struct_t struc;

void func_v(struct_t struc)
{
  printf("v struc: %ld\n",sizeof(struc));
  printf("v struc.arr: %ld\n",sizeof(struc.arr));
}

void func_r(struct_t *struc)
{
  printf("r struc: %ld\n",sizeof(*struc));
  printf("r struc.arr: %ld\n",sizeof(struc->arr));
}


int main() {
  func_v(struc);
  func_r(&struc);
  return 0;
}

Kimenet:

charlie@chainmbp-m2 arr_t % ./a.out
v struc: 1337
v struc.arr: 1337
r struc: 1337
r struc.arr: 1337

Mint látható, akkor is konzisztensen működik, ha cím szerinti átadás történik... a fenti nem ijesztő akkor? Ezt vajon hogy csinálhatja a fordító! Fekete mágia...! :) Rettegjünk együtt... A válasz amúgy kb. az mint a C, a Pascal, vagy bármilyen más nyelv esetében - tudnod kell mit csinál rá a fordító, és a nyelv. Semmi ijesztő nincs benne. De attól még lehet véleményed arról, hogy egy szabály rossz vagy nem. És nem kell aggódni, a Pascalban, főleg az Object Pascalban van jópár olyan dolog, amit ugyanígy nem konzisztens... De legalább az alapok egyben vannak.

Najó hagyjuk, tényleg...