2016-07-07 2 views
0

Верно или неверно: Следующее назначение является действительным:указатель и тип отливать

#define GIMME *(unsigned int**) 0x3000 
unsigned short d = 42; 
GIMME = &d; 

Это неверно, хотя я не могу понять, почему. Я недавно перевел форму Java на C, поэтому любая помощь будет оценена.

+3

Как вы определяете "действительно"? Кажется правильным, если строки находятся в определении функции. Целое число «0x3000» будет преобразовано в указатель в соответствии с реализацией, а «unsigned short» и 'unsigned int' могут иметь одинаковое требование выравнивания. – MikeCAT

+3

Что вы хотите сделать? –

+2

Это не тот код, который вы ищете. Получите хорошую книгу C вместо этого. – 2501

ответ

3

код пытается 2 сомнительные вещи:

  1. Назначение данных в некоторые место (3000), не известно, действует.

    *(unsigned int**) 0x3000 = &d; 
    
  2. Попытка присвоить несовместимые типы. Выравнивание может завершиться неудачно, так как unsigned short может быть уже unsigned int. IOW, 2 типа могут имеют разные минимальные требования к выравниванию.

Указатель на тип объекта может быть преобразован в указатель на другой тип объекта. Если результирующий указатель неправильно выровнен для ссылочного типа, поведение не определено. C11 §6.3.2.3 7

// similar simplified example 
    unsigned short d = 42; 
    unsigned int* gimme; 
    gimme = &d; // warning: assignment from incompatible pointer type 
Смежные вопросы