9

我必须处理一个 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 中生成警告

错误数组下标高于数组边界

有人可以解释一下这是什么意思吗?

谢谢

4

4 回答 4

9

结构字段pad被定义为“5 个数组uint32_t”。您必须将变量定义与使用变量不同。因此,既然pad定义了,pad[5]就意味着“获取pad数组的第五个(从 0 开始计数)元素”。但是数组中没有这样的元素pad,因为这个数组可用的最高索引是 4。

此外,您似乎想返回指向该数组第一个元素的指针,而不是第五个元素。所以你必须这样重写你的函数:

uint32_t * get_pad_5( a_structure * my_struct)
{
    return my_struct->pad;
}
于 2012-10-08T16:12:49.113 回答
5

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

于 2012-10-08T15:49:41.427 回答
2

C 中的数组是从零开始的。

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

该警告意味着您正在尝试访问数组外的元素。索引5表示第六个元素,数组只有 5 个元素。

于 2012-10-08T15:52:37.820 回答
1

一个由 5 个元素组成的数组具有索引01234。索引5超出范围。通常,N 个元素的数组具有从0N-1包含的有效索引。

于 2012-10-08T15:50:01.720 回答