Изменение объекта с помощью указателя на const
является некорректным, а не неопределенным поведением.
Исправление, которое путем отбрасывания const
является корректным, если только объект, на который ссылаются, не является const
.
В вашем коде другая проблема:
Вы отбрасываете const
-квалификатор при передаче p
из call_increment()
в increment()
.
Любой полезный компилятор будет жаловаться начто даже без запроса :
g++ -x c -std=c18 main.cpp && ./a.out
main.cpp: In function 'call_increment':
main.cpp:6:15: warning: passing argument 1 of 'increment' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
increment(p);
^
main.cpp:1:21: note: expected 'int *' but argument is of type 'const int *'
void increment(int* p) {
~~~~~^
Просто прислушайтесь к этому, и лучше попросите больше, по крайней мере -Wall -Wextra
.