0
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 中存储地址可能有问题的情况或任何架构是什么?

请举一些例子。

4

3 回答 3

9

在 int 中存储地址可能有问题的情况或任何架构是什么?

指针大于int. 也就是说,大多数 64 位系统。您可以使用 typelong或更好的intptr_t.

于 2012-07-29T11:28:02.190 回答
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 个字节,导致在本质上是随机内存上乱涂乱画。

故事的寓意:如果您正在处理指针,请使用指针。

于 2012-07-29T14:58:46.087 回答
1

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

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

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

于 2012-07-29T15:02:26.657 回答