Это нормально, чтобы ввести адрес в целое число?

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 байта вашего адреса, что приведет к набору по существу случайной памяти.

Мораль истории: если вы имеете дело с указателями, используйте указатели.

Другие вопросы по тегам