Программирование на C: приведение пустого указателя к int? - PullRequest
17 голосов
/ 20 октября 2011

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

ptr = (void *)5;

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

Ответы [ 4 ]

33 голосов
/ 20 октября 2011

Вы приводите 5 в качестве пустого указателя и присваиваете его ptr.

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

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

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

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

printf("%d\n",*((int*)ptr));
3 голосов
/ 20 октября 2011

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

Если вы можете, вместо этого вы должны использовать объединение:

union {
    void *ptr;
    int i;
};

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

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

0 голосов
/ 20 октября 2011

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

0 голосов
/ 20 октября 2011

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

...