2015-08-02 3 views
0

Рассмотрите следующую ситуацию.Сохранение указателя на память, указываемого указателем пустоты

У меня есть void * first, указывающий на определенный объем памяти. У меня есть еще один void * second, указывающий на что-то еще. Я хочу сохранить void * second в памяти, указанной первым указателем. enter image description here

Мой подход:

*(void**) first = second;

Является ли это действительным? Существуют ли какие-либо меры предосторожности?

+0

Вы хотите скопировать данные из второй области в первой? – walruz

+1

нет, это не так. Скорее всего, вы хотите 'memcpy (first, second, the_size);'. –

+0

Я хочу, чтобы адрес второй области был сохранен в первой области. –

ответ

5

Вы можете написать все, что вы хотите в ячейку памяти, указываемой void* до тех пор, как:

  • Это достаточно большое, чтобы держать этот тип данных
  • Он достаточно выровнен для типа данных
  • Считывают из этого места в соответствии с записями

Итак, это законно делать такие вещи, как:

void* first = malloc(sizeof(void*)); 
*(void**)first = second; 
.... 
void* another = *(void**)first; //Now another == second 

Но что-нибудь еще, например:

  • malloc(sizeof(int*)) или malloc(4)
  • void* first = &someCharArray[11]
  • int* another = *(int**)first

ли реализация определяется в лучшем случае. А иногда и неопределенное поведение.

Это точно, что тип void* для - вы нанесли какой-то указатель на void*, затем вы отбрасываете назад. Вы несете ответственность за соответствие типов.

+0

@JensMunk Кажется, форматирование комментариев в StackOverflow оказало негативное влияние на ваше выражение, в частности на символы '*'. Закройте в backticks '\' ', чтобы избежать интерпретации текста * * курсивного * в качестве * курсивного текста *. – dyp

+0

@dyp Спасибо, я запомню этот '* (void **) first = second;' отлично –

0

Попробуйте

#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    int memory[10]; 
    void *first = (void *)memory; 
    void *second = (void *)&memory[5]; 

    *(int *)first = (int)second; 

    return 0; 
} 

Вы можете проверить результат в памяти [0]

Смежные вопросы