| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1161 人关注过本帖
标题:相同的指针 同时指向不同的值 ?
只看楼主 加入收藏
奇点点
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2022-9-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
相同的指针 同时指向不同的值 ?
我做了一个实验, 用一个普通指针指向一个常量, 然后通过指针修改了常量的值, 然后分别访问指针指向的值和常量原值, 竟然是不同的, 但是他们的地址却是相同的, 请高人指点.

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

截图:

代码:
程序代码:
#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

运行结束。
搜索更多相关主题的帖子: 相同 指针 int 常量 指向 
2022-09-14 10:57
奇点点
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2022-9-14
收藏
得分:0 
好了没问题了, 是编译器的问题, 我用其他编译器这段代码是不能运行出结果的, 但我实验用的 Lightly 在线编译器竟然可以运行出结果, 不知道它是什么原理.
2022-09-14 11:05
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:7 
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

2022-09-14 11:08
奇点点
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2022-9-14
收藏
得分:0 
回复 3楼 吹水佬
我贴不了图, 我在 https://www. 运行的结果也是不同的值.
在这里用C++编译运行也是两个不同的值.

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

2022-09-14 11:24
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:7 
以下是引用奇点点在2022-9-14 11:05:48的发言:

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

这是“未定义行为”,不是编译器的问题,是你自己的问题
2022-09-14 14:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
这是个“未定义行为”,很好理解;
输出“10, 100”属于“未定义行为”之一,也很好理解,无非就是 const编译期常量被直接优化掉了。

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

我找到一篇专门说明这种用指针修改常量的未定义行为的文章
https://
2022-09-14 17:56
mature119
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:29
专家分:45
注 册:2021-12-7
收藏
得分:7 
回复 楼主 奇点点
&这么用的?

2022-09-20 21:38
快速回复:相同的指针 同时指向不同的值 ?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.071787 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved