C 将地址类型转换为整数可以吗?

C 将地址类型转换为整数可以吗?,c,casting,C,Casting,在上面的代码中,队列可以存储整数值,而地址被分配到队列中。它会产生任何问题吗 在什么情况下或任何体系结构中,在int中存储地址可能会有问题? 请举例说明 在什么情况下或任何体系结构中,在int中存储地址可能会有问题 指针大于int的体系结构。也就是说,大多数64位系统。您可以使用类型long或更好的intptr\u t您不必去怪诞的体系结构,在那里您的假设会咬到您的屁股,以64位英特尔拱门为例: Queue queue = createQueue(); //queue to store int

在上面的代码中,队列可以存储整数值,而地址被分配到队列中。它会产生任何问题吗

在什么情况下或任何体系结构中,在int中存储地址可能会有问题?

请举例说明

在什么情况下或任何体系结构中,在int中存储地址可能会有问题


指针大于
int
的体系结构。也就是说,大多数64位系统。您可以使用类型
long
或更好的
intptr\u t

您不必去怪诞的体系结构,在那里您的假设会咬到您的屁股,以64位英特尔拱门为例:

Queue queue = createQueue(); //queue to store int values
Node *node = getNode(8); 
enQueue(queue, (int)node);//storing an address in the int

..... some other statements ....

Node *root = (Node *) deQueue(queue);//typecasting an int to address
Node *left = root->left;
所以,是的,你会遇到问题,因为你会默默地截断地址的高位4字节,导致在基本上是随机的内存上涂鸦


故事的寓意:如果你在处理指针,就要使用指针。

对于32位系统,
int
long
int*
的大小通常是一致的,所以这不是问题。但在64位体系结构中,将指针强制转换为整数(或返回)可能会失败

对于C99或C11,它存在一个可选功能:
(u)intptr_t
from
stdint.h
(一种整数类型,可以存储存储在
void
指针中的值)。它可以在许多平台上工作,除了使用一个补充的机器


使用C89,您可以使用
无符号长
变量;它通常会起作用。但是为什么不使用
void
指针呢?

还有
uintptrut
,它们都在
stdint.h
右侧。问题中描述的方法不是一个好主意。最好使用节点对象的辅助数组,并将节点对象的索引存储在队列本身中(假设无法更改用于管理队列类型实例的接口)。
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, const char *argv[])
{
    printf("sizeof int is %i\n", sizeof(int));
    printf("sizeof long is %i\n", sizeof(long));
    printf("sizeof void * is %i\n", sizeof(void *));

    exit(0);
}
sizeof int is 4
sizeof long is 8
sizeof void * is 8