栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

MacOS无法通过指针修改常量的值

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MacOS无法通过指针修改常量的值

今天复习C语言继续踩坑。

一般来说,c语言中用const修饰的常量是无法进行修改的,但是指针可以获取改常量地址,通过地址可以进行修改。准确的来说,c语言中的常量应该是只读变量。

下面代码定义了红色的常量,通过指针修改red值,打印输出指针修改前后的red值。

#include

int main() {
    const int red = 0xFF0000;
    printf("source %dn", red);

    int *p = &red;
    *p = 0;
    printf("exchange %dn", red);

    return 0;
}

上面这段代码在mac和windows上运行显示两种不同的结果

在windows上:

在MacOS上:

同样都是通过指针p来修改了red地址所保存的值,为什么macos最后打印的结果还是修改之前的? 并且进行断点调试,red地址的值的确被修改掉了,但输出结果依旧是red原本的赋值。

下图是在macos断点调试中的截图:

第二次打印时,red已经被修改成了0,输出结果却仍是初始的值。

理论来说,const所修饰的常量的确是不允许修改的,但c语言的指针特性使常量变成了只读变量。
macos系统下,编译器对常量进行了优化保护 。认为常量不会被修改,直接把定义的常量的值替换到了最后一次printf输出。

所以定义常量可以使用宏定义

#define RED 0xFF0000
int main(){
	// ...
	return 0 ;
}

如果我就是必须要在mac上通过指针来修改常量呢?
可以使用volatile关键字来修饰常量。

volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

volatile const int red = 0xFF0000;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号