注册 登录
编程论坛 C语言论坛

相同的指针 同时指向不同的值 ?

奇点点 发布于 2022-09-14 10:57, 1556 次点击
我做了一个实验, 用一个普通指针指向一个常量, 然后通过指针修改了常量的值, 然后分别访问指针指向的值和常量原值, 竟然是不同的, 但是他们的地址却是相同的, 请高人指点.

代码运行没有报错, 只是报警告了, 因为我用普通指针指向常量了.

截图:

代码:
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void) {

    const int a = 10;
    int* pa = &a;

    *pa = 100;
    printf("%d, %d\n", a, *pa);
    printf("%p,%p\n", &a, pa);

    return 0;
}


运行结果
程序代码:
开始运行...
/workspace/CProject1/main.c:7:10: warning: initializing 'int *' with an expression of type 'const int *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
    int* pa = &a;
         ^    ~~
1 warning generated.
10, 100
0x7ffed0567e58,0x7ffed0567e58

运行结束。
7 回复
#2
奇点点2022-09-14 11:05
好了没问题了, 是编译器的问题, 我用其他编译器这段代码是不能运行出结果的, 但我实验用的 Lightly 在线编译器竟然可以运行出结果, 不知道它是什么原理.
#3
吹水佬2022-09-14 11:08
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

#4
奇点点2022-09-14 11:24
回复 3楼 吹水佬
我贴不了图, 我在 https://www. 运行的结果也是不同的值.
在这里用C++编译运行也是两个不同的值.

[此贴子已经被作者于2022-9-14 11:29编辑过]

#5
rjsp2022-09-14 14:05
以下是引用奇点点在2022-9-14 11:05:48的发言:

好了没问题了, 是编译器的问题, 我用其他编译器这段代码是不能运行出结果的, 但我实验用的 Lightly 在线编译器竟然可以运行出结果, 不知道它是什么原理.

这是“未定义行为”,不是编译器的问题,是你自己的问题
#6
rjsp2022-09-14 14:32
这是个“未定义行为”,很好理解;
输出“10, 100”属于“未定义行为”之一,也很好理解,无非就是 const编译期常量被直接优化掉了。

但在C++中有个 std::launder 函数,比如 *std::launder(&a) 就必然是 100 而不是 10
然而可惜,翻看 std::launder 的实现后发现,它没法用标准方法实现,需要编译器特殊照顾
#7
奇点点2022-09-14 17:56
学习了, 总的来说就是如果不按规矩办事, 让编译器帮忙擦屁股 就会出现这种情况, 不同编译器可能有不同的处理方法,
以后强转类型的时候都要多加注意, 常量就是常量, 用常量指针指常量, 不要乱搞就是了.

我找到一篇专门说明这种用指针修改常量的未定义行为的文章
https://
#8
mature1192022-09-20 21:38
回复 楼主 奇点点
&这么用的?

1