将地址转换为整数是否可以?

时间:2012-07-29 11:26:35

标签: c casting

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;

在上面的代码中,队列可以存储整数值,同时在其中存储地址。可以创建任何问题吗?

在int中存储地址的情况或架构会出现什么问题?

请举一些例子。

3 个答案:

答案 0 :(得分:9)

  

在int中存储地址可能会出现问题的情况或架构是什么?

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

答案 1 :(得分:1)

你不必去那些你的假设会让你陷入困境的糟糕建筑,采取64位的英特尔拱门:

#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

所以,是的,你会遇到问题,因为你会默默地截断地址的高4字节,导致在基本随机的内存上涂鸦。

故事的道德:如果你正在处理指针,请使用指针。

答案 2 :(得分:1)

使用32位系统时,intlongint*的大小通常会重合,所以这不是问题。但是在64位体系结构中将指针转换为整数(和返回)可能会失败。

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

使用C89,您可以使用void变量;它通常会起作用。但为什么不使用unsigned long指针?