我有一个处理lib的结构:
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;
我的问题来自我不太懂的结构的pad [5]成员。 我认为这个成员可以作为其他成员使用:
uint8_t get_response_type( a_structure * my_struct)
{
return my_struct->response_type;
}
但是这个功能:
uint32_t get_pad_5( a_structure * my_struct)
{
return my_struct->pad[5];
}
在gcc中生成警告
错误数组下标高于数组边界
有人能解释一下这意味着什么吗?
Thxs
答案 0 :(得分:8)
结构字段pad
被定义为“5 uint32_t
的数组”。您必须将变量定义与使用变量区分开来。因此,由于pad
已定义,pad[5]
表示“获取pad
数组的第五个(从0开始计算)元素”。但是pad
数组中没有这样的元素,因为此数组可用的最高索引是4。
此外,您似乎想要返回指向此数组的第一个元素的指针,而不是第五个元素。因此,您必须以这种方式重写您的功能:
uint32_t * get_pad_5( a_structure * my_struct)
{
return my_struct->pad;
}
答案 1 :(得分:5)
当您创建一个包含5个成员的数组时,它们会被索引为0-4,如果您尝试访问5,那么您将超出范围
答案 2 :(得分:2)
C中的数组基于零。
my_struct->pad[0]; // the first pad
my_struct->pad[4]; // the fifth pad
警告意味着您正在尝试访问阵列外部的元素。索引5
表示第六个元素,数组只有5个元素。
答案 3 :(得分:1)
包含5个元素的数组包含索引0
,1
,2
,3
和4
。索引5
超出范围。通常,N个元素的数组具有从0
到N-1
的有效索引。