OK, więc C jest wartością typu pass-by-value, co oznacza, że zamiast zmiennej oryginalnej użyto kopii zmiennej, prawda? Czy ta kopia będzie miała zawsze ten sam adres pamięci? Rozważmy następujący kod:Czy parametr funkcji w C ma zawsze ten sam adres pamięci?
void test(int *ptr) {
printf("&ptr: %p\n", &ptr);
printf("ptr: %p\n", ptr);
printf("*ptr: %d\n\n", *ptr);
}
int main() {
int a = 1, b = 2, c = 3, d = 4, e = 5;
test(&a);
test(&b);
test(&c);
test(&d);
test(&e);
return 0;
}
Wyjście mam z tego kodu jest to:
&ptr: 0x7fff70536728
ptr: 0x7fff7053674c
*ptr: 1
&ptr: 0x7fff70536728
ptr: 0x7fff70536750
*ptr: 2
&ptr: 0x7fff70536728
ptr: 0x7fff70536754
*ptr: 3
&ptr: 0x7fff70536728
ptr: 0x7fff70536758
*ptr: 4
&ptr: 0x7fff70536728
ptr: 0x7fff7053675c
*ptr: 5
Moje przeczucie było „nie”. Rozumiem, że ptr
nie istnieje poza blokiem kodu test()
. Dlaczego więc &ptr
jest takie samo dla wszystkich pięciu wywołań funkcji?
Nie można zagwarantować, że będzie taki sam. Obserwujesz nieokreślone zachowanie. (Możesz zobaczyć zmianę adresu, jeśli wywołasz go z innej funkcji oprócz głównej.) –
i może nie wykazywać takiego zachowania w ogóle, nawet bez interweniującego wywołania funkcji. w zależności od implementacji na konkretnej maszynie. –
@AndyzSmith także w zależności od tego, jak kompilator zdecyduje się go zaimplementować. :) – jmstoker