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

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

ptr = (void *)5; 

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

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

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

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

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

 void *ptr = malloc(sizeof(int)); *((int*)ptr) = 5; printf("%d\n",*((int*)ptr)); 

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

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

 union { void *ptr; int i; }; 

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

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

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

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