2010/10/14

Amnezja

Czasami mam wrażenie że metodą optymalizacji zapominam co mniej istotne aspekty. Kiedyś już chyba głowiłem się nad zagadnieniem przekazywania tablic w parametrach funkcji.

Przywykłem do tego ze tablice deklarujemy w parametrach funkcji jako
fkt(int tab[])

W kodzie kolegi zobaczyłem
fkt(int tab[10])

Pierwsze skojarzenie jakie mi się nasunęło, to że ta tablica przejdzie przez stos jako kopia pamięci (40bajtow)...

Okazalo sie ze jest inaczej:
#include

struct ss {
    int field1;
    int field2;
    int tab[100];
};

void fkt(char tab[10])
{
    printf("%p\n", tab);
}

void fkt2(struct ss param)
{
    printf("%p\n", &param);
}

int main()
{
    char tab[10] = { 0, 1, 2 };
    char tab2[] = { 1, 1, 1};
    struct ss param;

    fkt(tab);
    printf("%p\n", tab);
    fkt(tab2);
    printf("%p\n", tab2);

    fkt2(param);
    printf("%p\n", &param);

    return 0;
}


Wynik:
[xzs6ts@TVBuildAlfa BWL]$ ./a
0xbfa01916
0xbfa01916
0xbfa01913
0xbfa01913
0xbfa015d0
0xbfa01778


Dlaczego przekazywanie struktur przez stos jest wykonywane jako kopia a tablic jako referencja ?
"nazwa zmiennej tablicowej jest jednoczenie wskaźnikiem do pierwszego elementu"
Z tego tez powodu w języku C nie możemy powiedzieć "przekaz tablice", bo "się po prostu nie da" :)
Za to możemy powiedzieć "przekaz strukturę" co tez kompilator czyni.