2012-10-08 18 views
5

Tôi có một để đối phó với một cấu trúc của một lib:C và gcc mảng lỗi subscript là mảng trên tiếp giáp

typedef struct { 
    uint8_t response_type; 
    uint8_t error_code; 
    uint16_t sequence; 
    uint32_t resource_id; 
    uint16_t minor_code; 
    uint8_t major_code; 
    uint8_t pad0; 
    uint32_t pad[5]; 
    uint32_t full_sequence; 
} a_structure; 

vấn đề của tôi đến từ pad [5] thành viên của cấu trúc mà tôi không thực sự hiểu. Tôi thougth thành viên này có thể được sử dụng như các thành viên khác trong chức năng như thế:

uint8_t get_response_type(a_structure * my_struct) 
{ 
    return my_struct->response_type; 
} 

nhưng chức năng này:

uint32_t get_pad_5(a_structure * my_struct) 
{ 
    return my_struct->pad[5]; 
} 

tạo ra cảnh báo trong gcc

lỗi mảng subscript là ở trên mảng bounds

Ai đó có thể khám phá n tôi điều này có nghĩa là gì?

Thxs

+0

Tôi có một mã khá chập rằng gcc quản lý để tìm ra và cảnh báo "mảng lỗi subscript là trên mảng giới hạn Vì vậy, mặc dù vấn đề bài này là hiển nhiên, việc tìm kiếm này. (vì cảnh báo phù hợp được đăng) đã giúp giải quyết vấn đề phức tạp hơn của tôi – chux

Trả lời

6

Trường cấu trúc pad được định nghĩa là "mảng 5 uint32_t". Bạn phải định nghĩa biến khác nhau bằng cách sử dụng biến. Vì vậy, kể từ khi pad được xác định, pad[5] có nghĩa là "lấy phần tử thứ năm (đếm từ 0) của pad mảng". Nhưng không có phần tử như vậy trong mảng pad, vì chỉ mục cao nhất có sẵn cho mảng này là 4.

Ngoài ra, có vẻ như bạn muốn trả về con trỏ đến phần tử đầu tiên của mảng này chứ không phải phần tử thứ năm. Vì vậy, bạn phải viết lại chức năng của bạn theo cách này:

uint32_t * get_pad_5(a_structure * my_struct) 
{ 
    return my_struct->pad; 
} 
+0

Từ những gì bạn kết luận OP quan tâm tôi là yếu tố thứ nhất? – alk

+1

@alk OP muốn đối phó với "pad [5] thành viên". không hiểu mảng chỉ mục (không có phần tử thứ năm trong mảng 'pad') hoặc định nghĩa mảng/con trỏ/sử dụng (thành viên của cấu trúc là' pad', không phải 'pad [5]'). Và tôi cũng tin rằng vấn đề thứ hai làm cho sự nhầm lẫn nhiều hơn cho một newbie. – ThomasMore

5

Khi bạn thùng một mảng với 5 thành viên, họ được lập chỉ mục 0-4, nếu bạn cố gắng acces 5, bạn nằm ngoài giới hạn

1

Một mảng của 5 yếu tố có chỉ số 0 , 1, 2, 34. Chỉ số 5 nằm ngoài giới hạn. Nói chung, một mảng các phần tử N có các chỉ số hợp lệ từ 0 đến N-1.

2

Mảng trong C bằng 0.

my_struct->pad[0]; // the first pad 
my_struct->pad[4]; // the fifth pad 

Cảnh báo có nghĩa là bạn đang cố truy cập phần tử bên ngoài mảng. Chỉ mục của 5 có nghĩa là phần tử thứ sáu và mảng chỉ có 5 phần tử.

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