2015-05-04 3 views
1

У меня есть немного путаницы в вопросе об изменении указателя структуры на структурную переменную .разыменование структуры указатель на структурную переменную

Будет хорошо, если я продемонстрирую свою проблему с примером.

Так вот я:

struct my_struct{ 
    int num1; 
    int num2; 
}tmp_struct; 

void Display_struct(void * dest_var){ 

    struct my_struct struct_ptr; 

    struct_ptr = *((struct my_struct *)dest_var); 

    printf("%d\t%d\n",struct_ptr.num1,struct_ptr.num2); 

} 

int main() 
{ 
    tmp_struct.num1 = 100; 
    tmp_struct.num2 = 150; 


    Display_struct(&tmp_struct); 
    return 0; 
} 

Теперь, когда я бегу этот пример я могу получить код для компиляции в очень чистой форме, а также выход правильно.

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

int example_num; 

void Display_struct(void * dest_var){ 

    int example_num_ptr; 

    example_num_ptr = *((int *)dest_var); 

    printf("%d\t%d\n",struct_ptr.num1,struct_ptr.num2); 
} 

int main() 
{ 
    example_num = 100; 


    Display_struct(&example_num); 
    return 0; 
} 

Здесь мы можем разыменовать int-указатель на int-переменную, поскольку это простой тип данных , но, на мой взгляд, мы не можем просто разыменовать указатель структуры аналогично структурной переменной, поскольку это не простой тип данных, а сложный тип данных или структура данных.

Пожалуйста, помогите мне в решении этой концепции.

+0

Почему вы не могли разыменовать указатель на структуру? какова была бы точка в указателе, что вы не можете получить доступ к базовому объекту? –

+0

Вы имеете в виду что-то вроде этого: https://ideone.com/lduzh0? – mch

+2

В чем проблема? BTW Второй пример неверен, вы пытаетесь напечатать 'struct_ptr.num1', но во втором примере нет' struct_ptr'. –

ответ

1

Единственная проблема заключается в том, что вы должны гарантировать, что пройденный void* указывает на переменную правильного типа структуры. Пока это происходит, все будет нормально работать.

Вопрос в том, почему вы должны использовать указатель void, а не ожидаемую структуру, но я предполагаю, что эта функция является частью некоторой общей настройки программирования, иначе было бы бессмысленно использовать указатели void.

Однако, если вы попытаетесь что-то «хак», как это:

int arr[2] = {100, 150}; 
Display_struct(arr); // BAD 

Тогда нет больше никаких гарантий нет: выше кода будет компилироваться только штрафом, но он вызывает неопределенное поведение и, следовательно, может привести к аварийному & ожога , Структура может содержать байты заполнения в любом месте, а код также нарушает правила "strict aliasing" С.

(Aliasing относится к правилам, изложенным в стандартной главе C 6.5 Выражения, 7§)

0

Вы думаете вверх проблема там, где их нет. A struct-тип (псевдоним совокупный тип данных) технически не очень отличается от любого другого типа.

Если мы посмотрим на вещи на нижнем уровне, переменная любого типа (включая тип struct) - это всего лишь некоторое количество бит в памяти.

Тип определяет количество бит в переменной и их интерпретацию.

Фактически, независимо от того, пересматриваете ли вы указатель-на-int или указатель-на-struct, вы просто получаете кусок бит, на который указывает указатель.

0

В вашей основной функции у вас есть struct tmp_struct. Это не указатель. Но это нормально, потому что вы передаете address из tmp_struct в функцию void Display_struct(void * dest_var).

Затем функция принимает входной аргумент, указатель (void *). Он содержит адрес «tmp_struct».

Затем внутри функции вы правильно устанавливаете ссылку.

struct_ptr = *((struct my_struct *)dest_var); 

вы почтительное void* к struct my_struct типа. Ваша де-ссылка правильная, потому что вы передаете объект того же типа. В противном случае это вызовет проблемы времени выполнения.

Независимо от того, насколько сложным является ваш тип данных или структура данных, де-ссылки должны работать нормально.

Но если входной тип arg недействителен * не забудьте пройти struct my_struct для работы.

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