Это нормально, чтобы ввести адрес в целое число?
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 ответа
В каких ситуациях или любой архитектуре может возникнуть проблема с сохранением адреса в int?
Архитектура, где указатели больше, чем int
, То есть большинство 64-битных систем. Вы можете использовать тип long
или лучше intptr_t
,
С 32-битной системой, размер int
, long
а также int*
обычно совпадают, поэтому это не проблема. Но приведение указателей к целому (и обратно) в 64-разрядной архитектуре может завершиться неудачей.
С C99 или C11, существует дополнительная функция: (u)intptr_t
от stdint.h
(целочисленный тип, который может хранить значение, хранящееся в void
указатель). Он работает на многих платформах, за исключением машины, которая использует дополнение.
С C89 вы можете использовать unsigned long
переменная; это обычно будет работать. Но почему вы не используете void
указатель?
Вам не нужно переходить к дурацким архитектурам, где ваше предположение может укусить вас за задницу, возьмите 64-битные арки Intel:
#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 байта вашего адреса, что приведет к набору по существу случайной памяти.
Мораль истории: если вы имеете дело с указателями, используйте указатели.