Nie, nie wszędzie blisko.
Standard C nie gwarantuje, że argumenty funkcji są przechowywane w następujących po sobie lokalizacjach pamięci (lub w konkretnym zamówieniu, w tym przypadku). Od kompilatora i/lub platformy (architektura) zależy sposób przekazywania argumentów funkcji do funkcji.
Aby dodać więcej klarowności, nie ma nawet żadnej gwarancji, że argumenty, które mają zostać przekazane, są w ogóle przechowywane w pamięci (na przykład stosie). Mogą również korzystać z rejestrów sprzętowych (, o ile są one odpowiednie,), dla niektórych lub wszystkich parametrów, aby operacje były szybkie. Na przykład,
PowerPC
architektury PowerPC posiada dużą liczbę rejestrów więc większość funkcji można przejść wszystkie argumenty rejestrów połączeń jednym poziomie. [...]
MIPS
Najpowszechniej używane wywołanie Konwencja 32 bitów MIPS jest ø32 ABI, który przechodzi przez pierwsze cztery argumentów funkcji w rejestrach $a0
- $a3
; kolejne argumenty są przekazywane na stosie. [...]
X86
Architektura x86 jest stosowany z wieloma różnymi konwencjami telefonicznych. Ze względu na niewielką liczbę rejestrów architektonicznych konwencje wywoływania x86 przeważnie przekazują argumenty na stosie, podczas gdy wartość zwracana (lub wskaźnik do niej) jest przekazywana do rejestru.
i tak dalej. Sprawdź full wiki article here.
Więc w twoim przypadku, bars[0]
jest ważny dostęp, ale czy bars[1]
i bars[2]
są ważne, zależy od bazowego środowiska (platforma/kompilatora), całkowicie. Najlepiej nie polegać na zachowaniu, którego się spodziewasz.
Powiedział, żeby przyczepić, w przypadku, gdy nie zamierzamy używać argumentów (jeśli) przeszedł do main()
, można po prostu zmniejszyć podpis int main(void) {
.
Czy prosisz o zaspokojenie swojej ciekawości, czy masz problem, który uważasz, że to rozwiąże? – StoryTeller
Po prostu z ciekawości, ponieważ argumenty variadyczne zdają się używać tej techniki do iteracji po jej argumentach. –