C-программирование: литье указателя void на int?

Скажем, у меня есть void * named ptr. Как именно я должен использовать ptr для хранения int? Достаточно ли написать

ptr = (void *)5;

Если я хочу сохранить номер 5? Или мне нужно malloc что-то сохранить?

Ответ 1

Вы набрасываете 5 на указатель пустоты и присваиваете его ptr.

Теперь ptr указывает на адрес памяти 0x5

Если это на самом деле то, что вы пытаетесь сделать... ну, да, это работает. Вы... вероятно, не хотите этого делать.

Когда вы говорите "хранить int", я собираюсь предположить, что вы хотите, чтобы вы действительно сохранили целочисленное значение 5 в памяти, на которое указывает void*. До тех пор, пока выделено достаточно памяти (sizeof(int)), вы можете сделать это с помощью кастинга...

void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;

printf("%d\n",*((int*)ptr));

Ответ 2

Это будет работать на всех платформах/средах, где sizeof(void*) >= sizeof(int), что, вероятно, большинство из них, но я думаю, что не все из них. Вы не должны полагаться на это.

Если вы можете использовать вместо этого союз:

union {
    void *ptr;
    int i;
};

Тогда вы можете быть уверены, что там место подходит для любого типа данных, и вам не нужен бросок. (Просто не пытайтесь разыменовать указатель, пока в нем есть не указательные данные).

В качестве альтернативы, если причина, по которой вы это делаете, заключается в том, что вы использовали int для хранения адреса, вместо этого вы должны использовать size_t intptr_t чтобы это было достаточно большим для хранения любого значения указателя на любой платформе.

Ответ 3

cast достаточна..................

Ответ 4

Указатель всегда указывает на адрес памяти. Поэтому, если вы хотите сохранить переменную с указателем, то, что вы хотите сохранить в этом указателе, является адресом памяти вашей переменной.