c-指针分配将指针从64位截断为32位



我一直在尝试修改likewise-open中的一段代码,但在这里完全被难住了。

一些背景

处理这个文件,尝试围绕一些LDAP查询进行编码:

typedef void *MYH;
typedef MYH HANDLE;
HANDLE hDirectory = NULL;     
hDirectory = LsaDmpGetLdapHandle(pConn);

此处定义了LsaDmpGetLdapHandle()

typedef void *MYH;
typedef MYH HANDLE;
HANDLE
LsaDmpGetLdapHandle(
IN PLSA_DM_LDAP_CONNECTION pConn
)
{
return pConn->hLdapConnection;
}

其中PLSA_DM_LDAP_CONNECTION是以下struct:的typedef

struct _LSA_DM_LDAP_CONNECTION
{
...
// NULL if not connected
HANDLE hLdapConnection;
...
};

基本上,到处都是HANDLE类型。

注意:为了避免各种*.h文件对其进行不同的定义,我在两个文件中都添加了typedef void *MYH;

问题

代码将在LsaDmpGetLdapHandle返回的hDirectory分配行之后崩溃,我尝试进一步使用hDirectory

到目前为止,我调试了什么

pConn中附加gdb,hLdapConnection为:

(gdb) p pConn->hLdapConnection
$5 = (void *) 0x7feb939d6390

然而,hDirectory是:

(gdb) p hDirectory
$6 = (void *) 0xffffffff939d6390

我不明白为什么在分配任务后会有差异

此外,需要注意的是,两个指针地址中的939d6390是共同的。

有趣的是,这两种方法都适用于

// If I pass hDirectory reference
LsaDmLdapGetHandle(pConn, &hDirectory);
// where this function is defined as, in the other file:
DWORD
LsaDmLdapGetHandle(
IN PLSA_DM_LDAP_CONNECTION pConn,
OUT HANDLE* phDirectory)
{
HANDLE hDirectory = NULL;
hDirectory = LsaDmpGetLdapHandle(pConn);
*phDirectory = hDirectory;
return ERROR_SUCCESS;
}
// Or I call another function, which then call LsaDmpGetLdapHandle(), in the other file
hDirectory = LsaDmLdapGetHandleCopy(pConn);
HANDLE
LsaDmLdapGetHandleCopy(
IN PLSA_DM_LDAP_CONNECTION pConn)
{
HANDLE hDirectory = NULL;
hDirectory = LsaDmpGetLdapHandle(pConn);
return hDirectory;
}

我想,也许是因为这两个文件中的HANDLE定义不同,所以我在两个文件中都添加了自己的void *定义

看起来像是这个的重复

默认情况下,所有返回值都是int。因此,如果函数缺少原型,则编译器将返回值视为32位,并为32位返回值生成代码。这就是你的4个字节被截断的时候。