2012-10-08 14 views
5

我有一个处理一个11b的结构:C和GCC误差数组下标被上述阵列界定

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; 

我的问题来自于垫[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

我有一个相当卷积码是GCC设法弄清楚,并警告“错误数组下标是以上数组边界所以,即使这个职位的问题是显而易见的,发现这一点。 (因为发布了匹配警告)确实有助于解决我更复杂的问题 – chux

回答

6

结构字段pad被定义为“数组5 uint32_t”。您必须使用变量来区分变量定义。因此,由于pad被定义,因此pad[5]表示“得到pad数组的第五个(从0开始计数)”元素。但pad阵列中没有这样的元素,因为此阵列可用的最高索引是4.

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

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

从哪些方面可以得出结论OP对我的第一个元素感兴趣? – alk

+1

@alk OP想要处理“pad [5]成员”,那就是他不理解数组索引(数组中没有第五个元素)或数组/指针定义/使用(结构成员是pad,而不是pad [5]')。我也相信第二个问题对于新手来说更加混乱。 – ThomasMore

5

当你箱5个成员的阵列,它们被索引0-4,如果你尝试存取权限5,你出界

1

的5个元素的数组具有索引01,2,34。指数5超出界限。通常,N个元素的阵列具有从0N-1(含)的有效索引。

2

C中的数组基于零。

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

警告意味着您正试图访问阵列外部的元素。索引5表示六分之一元素,而数组只有五个元素。