Если у меня есть пустой указатель, как мне вставить int в него? - PullRequest
12 голосов
/ 25 августа 2009

У меня есть массив произвольных значений, поэтому я определил его как массив пустых указателей, чтобы я мог указывать на любую информацию (например, int, массивы символов и т. Д.). Тем не менее, как на самом деле назначить int для него?

Возьмем, к примеру, эти инициализации:

void* data[10];
int x = 100;

Моя интуиция подумала бы так, но это дает ошибку компиляции:

data[0] = malloc(sizeof(int));
*(data[0]) = x;

Также я подумал об использовании &x, но я бы взял адрес локальной переменной, которая (на мой взгляд) будет очищена после выхода из процедуры. Так что, если у меня есть локальная переменная x, как я могу правильно передать ее в переменную типа void-указателя?

Ответы [ 5 ]

27 голосов
/ 25 августа 2009
*((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 (при условии, что ваши целые числа составляют 4 байта).

10 голосов
/ 25 августа 2009
*((int *)data[0]) = x;

Будет сделана копия x, поэтому тот факт, что это локальная переменная, не важен.

2 голосов
/ 25 августа 2009

Несмотря на то, что вы можете использовать приведение для выполнения назначения, возможно, гораздо чище написать код, подобный следующему:

void *data[ 10 ];
int x = 100;
int *p;

p = malloc( sizeof *p );
data[ 0 ] = p;
*p = x;
2 голосов
/ 25 августа 2009

по псевдонимам, это гораздо лучше сделать

mempcy( data[0], &x, sizeof( int ) );

Как это происходит, компилятор оптимизирует вызов memcpy, поскольку sizeof (int) является постоянным значением, но не нарушает различные правила псевдонимов.

1 голос
/ 25 августа 2009

попробуйте это:

data[0] = malloc(sizeof(int));
*((int*)data[0]) = x;

или

(int) (*(data[0])) = x;

не забудьте

free (data[0]);

впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...