如何在C中使用a#define中的指针和定义
我想知道这个定义的代码段中的如何在C中使用a#define中的指针和定义,c,pointers,client,user-defined-functions,C,Pointers,Client,User Defined Functions,我想知道这个定义的代码段中的gattCharCfg\u t是如何使用的 以下是#定义剪报: // Client Characteristic Configuration table (from CCC attribute value pointer) #define GATT_CCC_TBL( pValue ) ( (gattCharCfg_t *)(*((PTR_TYPE)(pValue))) ) 下面是如何在给定代码中的几个位置访问它: //
gattCharCfg\u t
是如何使用的
以下是#定义剪报:
// Client Characteristic Configuration table (from CCC attribute value pointer)
#define GATT_CCC_TBL( pValue ) ( (gattCharCfg_t *)(*((PTR_TYPE)(pValue))) )
下面是如何在给定代码中的几个位置访问它:
// Characteristic Configuration: voltage
static gattCharCfg_t *voltDataConfig;
// Allocate Client Characteristic Configuration table
voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
linkDBNumConns);
if (voltDataConfig == NULL)
{
return (bleMemAllocError);
}
我想我不理解它是如何被访问的。我当然希望能有更透彻的解释,因为我只是回到c中。在代码中,宏
GATT\u CCC\u TBL
1在任何地方都没有用处。代码正在强制转换ICall_malloc()
的返回值,该值可能会将void*
2返回到类型为gattCharCfg\u t
3的指针。如果这真的是代码,那实际上是不必要的
voltDataConfig = ICall_malloc(sizeof(gattCharCfg_t) * linkDBNumConns)
更好的版本是
voltDataConfig = ICall_malloc(sizeof(*voltDataConfig) * linkDBNumConns)
可能是正确的
1这就是
#定义
实际定义的内容。2您永远不需要将
void*
强制转换为另一个指针类型。3请注意,
gattCharCfg\u t
实际上是在代码中使用typedef
定义的类型,在任何地方都没有使用宏GATT\u CCC\u TBL
1。代码正在强制转换ICall_malloc()
的返回值,该值可能会将void*
2返回到类型为gattCharCfg\u t
3的指针。如果这真的是代码,那实际上是不必要的
voltDataConfig = ICall_malloc(sizeof(gattCharCfg_t) * linkDBNumConns)
更好的版本是
voltDataConfig = ICall_malloc(sizeof(*voltDataConfig) * linkDBNumConns)
可能是正确的
1这就是
#定义
实际定义的内容。2您永远不需要将
void*
强制转换为另一个指针类型。3请注意,
gattCharCfg\u t
实际上是一个用typedef
定义的类型
(PTR\u类型)(pValue)
-将pValue强制转换为PTR\u类型(指针)*((PTR_TYPE)(pValue))
-查看指针指向的内存位置(gattCharCfg_t*)(*((PTR_TYPE)(pValue))
-用于指向gattCharCfg_t
结构的指针(可以是gattCharCfg_t
的数组),而不是void*GATT\u CCC\u TBL
是一个宏,用于编写转换的快捷方式。关于你帖子中的其他代码
voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
linkDBNumConns);
sizeof(gattCharCfg\u t)
-取gattCharCfg\u t
的大小,例如23字节*linkDBNumConns
-将其乘以linkDBNumConns,例如,100等于2300字节ICall\u malloc(..)
-分配那么多内存(gattCharCfg\u t*)
-将内存中的该位置强制转换为指向gattCharCfg\u t
结构的指针typedef struct
{
uint16 connHandle; //!< Client connection handle
uint8 value; //!< Characteristic configuration value for this client
} gattCharCfg_t;
typedef结构
{
uint16连接句柄;//!<客户端连接句柄
uint8值;//!<此客户端的特征配置值
}关塔查;
因此,GATT\u CCC\u TBL(pValue)
将获取一个指针值pValue
,并将其指向一个或多个gattCharCfg\t结构-最有可能是这些结构的数组,因为_TBL很可能是“表”
(PTR\u类型)(pValue)
-将pValue强制转换为PTR\u类型(指针)*((PTR_TYPE)(pValue))
-查看指针指向的内存位置(gattCharCfg_t*)(*((PTR_TYPE)(pValue))
-用于指向gattCharCfg_t
结构的指针(可以是gattCharCfg_t
的数组),而不是void*GATT\u CCC\u TBL
是一个宏,用于编写转换的快捷方式。关于你帖子中的其他代码
voltDataConfig = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) *
linkDBNumConns);
sizeof(gattCharCfg\u t)
-取gattCharCfg\u t
的大小,例如23字节*linkDBNumConns
-将其乘以linkDBNumConns,例如,100等于2300字节ICall\u malloc(..)
-分配那么多内存(gattCharCfg\u t*)
-将内存中的该位置强制转换为指向gattCharCfg\u t
结构的指针typedef struct
{
uint16 connHandle; //!< Client connection handle
uint8 value; //!< Characteristic configuration value for this client
} gattCharCfg_t;
typedef结构
{
uint16连接句柄;//!<客户端连接句柄
uint8值;//!<此客户端的特征配置值
}关塔查;
因此,
GATT\u CCC\u TBL(pValue)
将获取一个指针值pValue
,并将其指向一个或多个gattCharCfg\t结构-最有可能是这些结构的数组,因为_TBL很可能是“表” 该行不定义gattCharCfg\u t
。此外,在代码中查找GATT\u CCC\u TBL(..)显示该行不定义gattCharCfg\u t
。此外,在代码中查找GATT\u CCC\u TBL(..)显示的位置“将获取一个指针值pValue
并将其转换为指向一个或多个gattCharCfg_t结构的指针”我想说您在这里错过了一个间接指向。它应该是“将获取一个指针值pValue
并将其指向的内容转换为指向的指针…”。请注意中的*
(*(((PTR_类型)(pValue)))
@alk,我同意“将指针值pValue
转换为指向一个或多个gattCharCfg\u t结构的指针”我想说您在这里错过了一个间接指向。它应该是“将指针值pValue
转换为指向的指针…”。注意(*((PTR\u类型)中的*
)(pValue))
@alk,我同意这一点