Không, không phải bất cứ nơi nào gần.
C tiêu chuẩn không đảm bảo rằng đối số chức năng được lưu trữ trong các vị trí bộ nhớ liên tiếp (hoặc, bất kỳ thứ tự cụ thể nào, cho rằng vấn đề). Nó tùy thuộc vào trình biên dịch và/hoặc nền tảng (kiến trúc ) để quyết định cách các đối số hàm được truyền cho hàm.
Để thêm một số chi tiết rõ ràng hơn, thậm chí không đảm bảo rằng các đối số sẽ được chuyển sẽ được lưu trữ trong bộ nhớ (ví dụ: ngăn xếp). Họ cũng có thể sử dụng các thanh ghi phần cứng (bất cứ khi nào có thể áp dụng), đối với một số hoặc tất cả các tham số, để thực hiện các thao tác nhanh. Ví dụ,
PowerPC
Kiến trúc PowerPC có một số lượng lớn các thanh ghi vì vậy hầu hết các chức năng có thể vượt qua tất cả các đối số trong thanh ghi cho các cuộc gọi mức độ duy nhất. [...]
MIPS
Việc phổ biến nhất được sử dụng quy ước gọi cho 32 bit MIPS là O32 ABI mà vượt qua bốn đối số đầu tiên vào một chức năng trong thanh ghi $a0
- $a3
; các đối số tiếp theo được truyền trên stack. [...]
X86
Kiến trúc x86 được sử dụng với nhiều công ước gọi khác nhau. Do số lượng nhỏ các thanh ghi kiến trúc, các quy ước gọi x86 chủ yếu là truyền các đối số trên stack, trong khi giá trị trả về (hoặc một con trỏ tới nó) được truyền vào một thanh ghi.
v.v. Kiểm tra full wiki article here.
Vì vậy, trong trường hợp của bạn, bars[0]
là một hợp lệ truy cập, nhưng dù bars[1]
và bars[2]
là hợp lệ, phụ thuộc vào cơ bản môi trường (nền tảng/biên dịch), hoàn toàn. Tốt nhất là không dựa vào hành vi bạn mong đợi.
Điều đó nói rằng, chỉ để nitpick, trong trường hợp bạn không có ý định sử dụng các đối số (nếu có) truyền cho main()
, bạn chỉ có thể giảm bớt chữ ký để int main(void) {
.
Nguồn
2016-07-25 10:10:19
Bạn đang yêu cầu thỏa mãn sự tò mò của mình hay bạn có vấn đề mà bạn cho rằng điều này sẽ giải quyết? – StoryTeller
Chỉ cần ra khỏi tò mò, kể từ khi đối số variadic dường như sử dụng kỹ thuật này để lặp qua các đối số của nó. –