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", ¶m);
}
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", ¶m);
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.
Brak komentarzy:
Prześlij komentarz