jin*_*wee 4 c pointers const undefined-behavior language-lawyer
假设我们有一个int引用为的变量,const int*该变量又别名为int *。从标准中是否清楚通过int *指针修改变量是否为未定义行为?
作为说明,请考虑以下代码:
void increment(int* p) {
(*p)++;
}
void call_increment(const int* p) {
increment(p);
}
int main(void) {
int x = 7;
int* p = &x;
call_increment(p);
}
Run Code Online (Sandbox Code Playgroud)
通过指向对象的修改对象const是格式错误的行为,不是未定义的行为。除非引用的对象实际上是,否则
通过抛弃来解决该问题const是正确的const。
您的代码有一个不同的问题:从传递给时,
您将丢弃const-qualifier 。pcall_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) {
~~~~~^
Run Code Online (Sandbox Code Playgroud)
请注意,最好至少要求更多-Wall -Wextra。