2015-07-28 3 views
5

У меня есть следующий код:Разыменование пустого указателя

#include <inttypes.h> 
#include <stdlib.h> 
struct a 
{ 
    void *p; 
}; 

int main(void) 
{ 
    struct a *ptr = malloc(sizeof(struct a)); 
    ptr->p = malloc(sizeof(uint8_t)); 
    *((uint8_t *) ptr->p) = 2; 
    return 0; 
} 

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

предупреждения: разыменований Пустоты * 'указателя

Я нарушаю любое правило, делая это или этот код хорош?

+0

Какие подозрения у вас есть о правилах, которые могут быть нарушены? –

+2

Если нет конкретной причины, по которой тип 'p' не просто' uint8_t * ', это ужасный код. – Staven

+0

@MattMcNabb литье изменяемое значение lvalue? Просто хотел подтвердить, что это хорошо или нет? – Gopi

ответ

6

Да, этот код является законным и не вызывает неопределенное поведение (за исключением случаев, когда malloc возвращает NULL).

3

В соответствии с стандартными мандатами этот код выглядит нормально. указатель на символ типа может использоваться для указания объекта без нарушения правила псевдонимов.

Процитируем стандарт, глава §6.3.2.3

[...]. Когда указатель на объект преобразуется в указатель на тип символа, результат указывает на младший адресный байт объекта. Последовательные приращения результата, вплоть до размера объекта, дают указатели на оставшиеся байты объекта.

+1

Код был бы в порядке, даже если бы он не был указателем на тип символа. Поскольку объект не имеет объявленного типа, * эффективным типом * для записи является тип, который вы используете для записи, (и эффективный тип для чтения - это тип последней вещи, написанной для объекта). Мы пишем только в этом примере, поэтому мы устанавливаем эффективный тип. –

+0

@MattMcNabb Абсолютно сэр. Я думал, что если 'p' не был« void * », то также, кастинг на« char * »(или эквивалент), и дальнейшее использование будет определено, правильно? –

+0

nb: Я думаю, что uint8_t не обязательно имеет тип символа (http://stackoverflow.com/questions/12666146/can-uint8-t-be-a-non-character-type) –

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