结构体设计技巧

本文主要记录在工作过程中遇到的,需要取结构体某个元素的偏移,或者结构体中有个变量的需要申请动态内存的设计技巧,姑且就叫技巧吧,做个记录,由于包含有动态申请的内存,因此,结构体的大小就并不是sizeof的大小了。

typedef struct tagSTRU_KEY_NODE
{
	unsigned int Key;
	unsigned char first;
	unsigned char second;
	unsigned char  rsr[2];
	struct tagSTRU_KEY_NODE *next;
}STRU_KEY_NODE;

typedef struct tagSTRU_KEY_HASH
{
	unsigned int itemNum;
	unsigned int bucketNum;
	unsigned int memLength;
	STRU_KEY_NODE *Item;
	STRU_KEY_NODE *bucket[1];
}STRU_KEY_HASH;

#define BUCKET_OFFSETOF(_st, _field)   ((unsigned int)((signed int)&(((_st *)0x10)->_field) - 0x10))

int main()
{

	STRU_KEY_HASH* hashTemp;
	BUCKET_OFFSETOF(STRU_KEY_HASH, bucket);  //计算bucket的偏移量
	memset(hashTemp->bucket, 0, sizeof(STRU_KEY_NODE)* 100);//当bucket节点大小未知的时候可以如上定义数据结构,后续动态申请一块内存(代码中未显示,省略了),然后进行初始化
}

  

原文地址:https://www.cnblogs.com/xqn2017/p/8005530.html