C和gcc错误数组下标在数组边界之上

时间:2012-10-08 15:48:05

标签: c

我有一个处理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

4 个答案:

答案 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个元素的数组包含索引01234。索引5超出范围。通常,N个元素的数组具有从0N-1的有效索引。