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

ced*_*emo 8 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;
Run Code Online (Sandbox Code Playgroud)

我的问题来自我不太了解的结构的pad [5]成员.我认为这个成员可以像以下那样用作其他成员:

uint8_t get_response_type( a_structure * my_struct)
{
   return my_struct->response_type;
}
Run Code Online (Sandbox Code Playgroud)

但是这个功能:

uint32_t get_pad_5( a_structure * my_struct)
{
   return my_struct->pad[5];
}
Run Code Online (Sandbox Code Playgroud)

在gcc中生成警告

错误数组下标在数组边界之上

有人能解释一下这意味着什么吗?

Thxs

Tho*_*ore 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;
}
Run Code Online (Sandbox Code Playgroud)

  • @alk OP 想要处理“pad[5] 成员”。那是他不理解数组索引(`pad` 数组中没有第五个元素)或数组/指针定义/使用(结构的成员是`pad`,而不是`pad[5]`)。而且我相信第二个问题会让新手更加困惑。 (2认同)

Min*_*n91 5

当您创建一个包含5个成员的数组时,它们会被索引为0-4,如果您尝试访问5,那么您将超出范围