2012-03-25 35 views
6

lập trình bảng vi điều khiển Arduino của tôi trong C, tôi nhận thấy một hành vi lạ.Mảng [-1] có cung cấp phần tử cuối cùng trong mảng không?

Do lỗi logic trong chương trình của tôi, trình điều khiển đã truy cập phần tử thứ -1 của một mảng nguyên.

int array[5]; 

array[4] = 27; 
// array[-1] gives 27 now. 

Có đúng là tôi lấy phần tử cuối cùng của mảng bằng cách sử dụng công cụ chọn yếu tố không?

+0

Có thể là do cùng một lỗi logic, trước tiên bạn * đã viết * vào vị trí đó và sau đó đọc những gì bạn mong đợi từ nó? – Irfy

+0

@ Irfy Tôi biết những gì bạn nghĩ về nhưng nó không phải là trường hợp. – danijar

Trả lời

13

Không, việc truy cập các phần tử bên ngoài phạm vi chỉ mục là hành vi không xác định. Trong trường hợp của bạn, phần tử tại địa chỉ ngay trước khi bắt đầu mảng của bạn được đặt thành 27.

Vì truy cập phần tử mảng trong C không có gì hơn làm số học con trỏ "thẳng", vượt qua chỉ mục phủ định không được phép. Bạn có thể xây dựng trường hợp sử dụng hợp pháp trong đó chỉ mục là số âm và dương:

int raw[21], *data = &raw[10]; 
for (int i = -10 ; i <= 10 ; i++) { 
    data[i] = i; 
} 
+0

Tôi đã chạy chương trình nhưng chương trình không bị lỗi. Tôi hiểu rằng hoạt động số học đang diễn ra. đáng ngạc nhiên là trình biên dịch gcc không phàn nàn là lỗi và cũng không đưa ra bất kỳ cảnh báo nào. Bạn có biết tại sao không? –

6

Không; array[-1] sẽ không truy cập phần tử cuối cùng. Nó có nhiều khả năng là vị trí bộ nhớ ngay trước khi mảng có 27 được lưu trữ trong đó. Hãy thử điều này:

array[4] = 27; 
array[-1] = 0; 

Sau đó kiểm tra xem array[-1] == array[4]. Chúng sẽ không bằng nhau (giả sử chương trình của bạn không sụp đổ khi gán cho array[-1]).

1

Không, điều đó không đúng theo tiêu chuẩn. Truy cập một phần tử bên ngoài mảng gọi hành vi không xác định.

Triển khai của bạn có thể (tôi nghi ngờ điều đó!) Cung cấp chức năng đó; nhưng bạn thực sự nên không phải dựa vào nó.

2

Truy cập các mảng có chỉ mục ngoài giới hạn không phải lúc nào cũng làm hỏng chương trình của bạn. Nếu bộ nhớ được truy cập bởi -1 nằm dưới sự kiểm soát chương trình của bạn hơn là một giá trị không xác định sẽ bật ra (được lưu trữ bởi một số dữ liệu khác được tạo bởi chương trình của bạn). Trong trường hợp của bạn nó chỉ là trùng hợp ngẫu nhiên.

-4

Nếu bạn đang đề cập đến C (và bạn đang có), thì không. Nếu bạn cố gắng truy cập vào một mảng với một chỉ mục tiêu cực, bạn sẽ nhận được một ngoại lệ giới hạn. Tuy nhiên, Lua thực hiện điều này chính xác như là một tính năng. Nếu bạn truy cập một mảng Lua với chỉ mục là -1, nó sẽ đọc phần tử cuối cùng của mảng. Chỉ mục -2 sẽ đọc phần tử thứ hai đến cuối cùng và phần bổ sung.

Side lưu ý: bạn có thể làm phiền đồng nghiệp của bạn bằng cách viết này

foo = {1,2,3,4,5,6,7,8,9,0} 
print(foo.length() * -1]) 

này in 1. Gây phiền nhiễu, không phải là nó.

Các vấn đề liên quan