mem_pool_tbl是一个数组表,索引是TBL_ID_TYPE枚举,
typedef enum
{
TBL_ID_BEGIN = 0;
TBL_ID_1,
TBL_ID_2,
TBL_ID_MAX,
}TBL_ID_TYPE;
int mem_pool_tbl[TBL_ID_TYPE]=
{1,2,3,4}
如果下面的方法看起来像下面那样检查大小/ ID是否为macth,我会徘徊,如下所示:
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#define CHECK_TBL_MISMATCH ((TBL_ID_MAX - TBL_ID_BEGIN ) != ARRAY_SIZE(mem_pool_tbl))
#if CHECK_NV_TBL_MISMATCH
# Hi there, if you see compiler err here , check the tbl if the ID is match
#endif
答案 0 :(得分:0)
C不支持范围检查数组(尽管某些编译器有一个静态分析器,它会尝试使用启发式检测此类错误)。它通常也没有办法确定数组的大小,因为数组只是一个字节范围,并且可以位于堆栈变量或堆块的中间。
但是,您可以使用两种方法:
1)完成数组的创建,从而防止客户端错误地使用它们。 E.g。
部首:
struct OpaqueTBLArray;
struct OpaqueTBLArray* MallocTblArray();
void FreeTblArray();
int GetTblArray( struct OpaqueTBLArray* self, size_t idx );
void SetTblArray( struct OpaqueTBLArray* self, size_t idx, int value );
实施源文件:
struct OpaqueTBLArray
{
int mem_pool_tbl[TBL_ID_MAX];
}
struct OpaqueTBLArray* MallocTblArray()
{
return (OpaqueTBLArray*) malloc( sizeof(OpaqueTBLArray) );
}
void FreeTblArray( OpaqueTBLArray* self )
{
free( self );
}
int GetTblArray( struct OpaqueTBLArray* self, size_t idx )
{
return self->mem_pool_tbl[idx];
}
void SetTblArray( struct OpaqueTBLArray* self, size_t idx, int value )
{
self->mem_pool_tbl[idx] = value;
}
这样,没有人使用你的结构会知道它的大小,或者能够在没有更多努力的情况下提供其他东西。例如,如果您只是在结构中添加一个size字段,那么这种方法也可以用于泛型数组类。
2)如果您的数组始终是本地范围内的堆栈变量,则可以在其上使用sizeof()运算符并除以sizeof(int)。但是,这仅适用于直接的,本地声明的固定大小的数组,而不适用于预处理器。