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中存储地址的情况或架构会出现什么问题?
请举一些例子。
答案 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位系统时,int
,long
和int*
的大小通常会重合,所以这不是问题。但是在64位体系结构中将指针转换为整数(和返回)可能会失败。
对于C99或C11,它存在一个可选的功能:来自(u)intptr_t
的{{1}}(一种整数类型,可以存储存储在stdint.h
指针中的值)。它适用于许多平台,除了使用补充的机器。
使用C89,您可以使用void
变量;它通常会起作用。但为什么不使用unsigned long
指针?