Если у меня есть указатель на пустоту, как мне вставить int?
У меня есть массив произвольных значений, поэтому я определил его как массив указателей void, поэтому я могу указать на любую информацию (например, int
, массивы символов и т.д.). Однако, как я действительно назначаю ему int
?
Возьмем, к примеру, эти инициализации:
void* data[10];
int x = 100;
Моя интуиция подумает об этом, но это дает ошибку компиляции:
data[0] = malloc(sizeof(int));
*(data[0]) = x;
Также я подумал об использовании &x
, но я бы взял адрес локальной переменной, которая (по моему мнению) была бы очищена после выхода из процедуры. Итак, если у меня есть локальная переменная x
, как я могу правильно ее перенести в тип указателя void?
Ответы
Ответ 1
*((int*)data[0])=x;
сделает это.
Возможно, вы захотите рассмотреть возможность использования объединения. Что-то вроде этого:
union myvalues
{
int i;
double d;
long l;
};
Тогда вы могли бы
union myvalues *foo[10];
foo[0] = malloc(sizeof(union myvalues));
foo[0]->i = x;
Вы можете также typedef
объединение. sizeof(union myvalues)
будет максимальным из sizeof
членов. Поэтому, если у вас есть int i;
и char c[40]
в объединении, sizeof(union myvalues)
будет 40. Запись в i
будет перезаписывать первые 4 символа в c
(при условии, что ваши int 4 байта).
Ответ 2
*((int *)data[0]) = x;
Будет сделана копия x, поэтому факт, что это локальная переменная, не имеет значения.
Ответ 3
Несмотря на то, что вы можете использовать бросок для выполнения задания, вероятно, гораздо проще написать код, например:
void *data[ 10 ];
int x = 100;
int *p;
p = malloc( sizeof *p );
data[ 0 ] = p;
*p = x;
Ответ 4
по причинам сглаживания гораздо лучше сделать
mempcy( data[0], &x, sizeof( int ) );
Как это бывает, компилятор будет оптимизировать вызов memcpy, поскольку sizeof (int) является постоянным значением, но он не нарушит различные правила псевдонимов.
Ответ 5
попробуйте следующее:
data[0] = malloc(sizeof(int));
*((int*)data[0]) = x;
или
(int) (*(data[0])) = x;
не забывайте
free (data[0]);
потом.