Это абсолютно нормально;компилятор выполняет неявное преобразование из My_Struct *
в const My_Struct *
.§6.3.2.3 спецификации C99 гласит:
Для любого квалификатора q указатель на тип, не квалифицированный как q , может быть преобразован вуказатель на q -квалифицированную версию типа;значения, сохраненные в исходных и преобразованных указателях, должны сравниваться равными.
Более того, даже если вы объявляете функцию с двумя несовместимыми объявлениями, так что один файл видит ее объявленной так:
void myFunction(My_Struct * p_my_struct);
даже если на самом деле это определено так:
void myFunction(const My_Struct * p_my_struct) { ... }
, даже если это разрешено спецификацией, даже если компилятор не знает, как выполнить неявное преобразование, потому что My_Struct *
и const My_Struct *
имеют одинаковое представление (так что преобразование в любом случае запрещено).
(Спасибо Кристофу и awoodland за их комментарии, разъясняющие последнюю ситуацию. В предыдущей версии этого ответа я ошибочно утверждал, чточто будет неопределенным поведением.)
Отредактировано, чтобы добавить: Обратное - определение функции с объявлением с указателем на неконстантныйпараметр, но вызов его с помощью объявления с параметром указателя на const - также разрешен по той же причине;но попытка на самом деле изменить данные вполне может привести к неопределенному поведению, в зависимости от того, откуда оно.(Например, A char *
может инициализировать строковую константу, но попытка изменить данные в этой константе является неопределенным поведением.)