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;在上面的代码中,队列可以存储整数值,而地址是存储在it.can中的。
,在int中存储地址可能有问题的情况或体系结构是什么?
请举几个例子。
发布于 2012-07-29 11:28:02
在int中存储地址可能存在问题的情况或任何体系结构是什么情况?
指针大于int的体系结构。也就是说,大多数64位系统。您可以使用long类型或更好的intptr_t。
发布于 2012-07-29 14:58:46
你不需要去那些你的假设会咬你屁股的古怪的架构,采取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个字节,导致在本质上随机内存上涂鸦。
这个故事的寓意是:如果你在处理指针,就使用指针。
发布于 2012-07-29 15:02:26
对于32位系统,int、long和int*的大小通常是一致的,所以这不是一个问题。但是,在64位体系结构中将指针转换为整数(和返回)可能会失败。
对于C99或C11,它存在一个可选特性:来自stdint.h的(u)intptr_t (一个可以存储在void指针中的值的整数类型)。它工作在许多平台上,除了使用自己的补充的机器。
使用C89,您可以使用一个unsigned long变量;它通常可以工作。但是为什么不使用void指针呢?
https://stackoverflow.com/questions/11708851
复制相似问题