问题描述
在:typedef unsigned char UCHAR,*PUCHAR;
中添加指针的目的是什么
(还有很多其他带有附加指针的 typedef 示例)我发现 UCHAR 旁边是 *PUCHAR 指针并检查了 sizeof(UCHAR) 和 sizeof(PUCHAR) 结果是 1 字节和 8 字节。这个指针大小是固定的还是灵活的?在一行中使用不同大小的数据类型制作 typedef 是否正确?如果操作系统将来将寻址扩展到 128 位(16 字节)会怎样?
在确定地址正在扩展的情况下,制作这么多数据类型的目的是什么?
typedef unsigned char UCHAR,*PUCHAR;
(...)
2.2.16 HANDLE
2.2.17 HCALL
2.2.18 HRESULT
2.2.19 INT
2.2.20 INT8
2.2.21 INT16
2.2.22 INT32
2.2.23 INT64
2.2.24 LDAP_UDP_HANDLE
2.2.25 LMCSTR
2.2.26 LMSTR
2.2.27 LONG
2.2.28 LONGLONG
2.2.29 LONG_PTR
2.2.30 LONG32
2.2.31 LONG64
2.2.32 LPCSTR
2.2.33 LPCVOID
2.2.34 LPCWSTR
2.2.35 LPSTR
2.2.36 LPWSTR
2.2.37 NET_API_STATUS
2.2.38 NTSTATUS
2.2.39 PCONTEXT_HANDLE
2.2.40 QWORD
2.2.41 RPC_BINDING_HANDLE
2.2.42 SHORT
2.2.43 SIZE_T
2.2.44 STRING
2.2.45 UCHAR
2.2.46 UINT
2.2.47 UINT8
2.2.48 UINT16
2.2.49 UINT32
2.2.50 UINT64
2.2.51 ULONG
2.2.52 ULONG_PTR
2.2.53 ULONG32
2.2.54 ULONG64
2.2.55 ULONGLONG
2.2.56 UNICODE
2.2.57 UNC
2.2.58 USHORT
2.2.59 VOID
2.2.60 WCHAR
2.2.61 WORD
解决方法
UCHAR 代表 unsigned char
,大小为 1 个字节。 PUCHAR 代表 unsigned char*
。要存储指针,您需要 8 个字节(在 64 位应用程序中)。这就是为什么UCHAR的大小是1个字节,PUCHAR的大小是8个字节的原因。
为什么一个指针是 8 个字节?
那是因为在 64 位应用程序中,单个字节的地址有 64 位。为了表示这一点,您需要 64 位。这就是为什么它需要 8 位。
我们不能只使用 *char 而不是 *PUCHAR 或者它可能是制作如此多数据类型的某种隐藏含义吗?
*PUCHAR
是 unsigned char**
,而不是 char*
。但是,如果我正确理解您的问题并且您的意思是“使用 unsigned char*
而不是 PUCHAR
”,是的,您可以。但前提是您了解底层类型。
开发人员采用这样的自定义 typedef 的原因可能很少。可能是为了适应多个平台、适应不同的架构、个人意见等......如果不知道真正的底层类型,我们实际上可能会在转换为另一种类型的过程中丢失信息。