Если у меня есть указатель на пустоту, как мне вставить 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]);

потом.