首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >c++编译器是否保护康斯特内存地址不受任何更改?

c++编译器是否保护康斯特内存地址不受任何更改?
EN

Stack Overflow用户
提问于 2020-06-03 00:50:48
回答 3查看 391关注 0票数 2

我想证明没有什么叫做(受保护的内存地址),整个故事只是关于编译器、操作系统,或者宿主应用程序正在运行的任何应用程序,只需对托管的应用程序发送到其上级进程的读和写请求进行一些检查,或者这个高级应用程序或您所称的任何东西--它决定这个子进程是否有权对这个特定的内存位置进行读写,但是这个c++代码在本质上不能工作,所以为什么:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
int main()
{
    const int x = 10;
    std::cout << &x << std::endl; // So i can view address of x
    std::cout << "x Before is equal "<< x <<std::endl;

    int y ;
    std:: cin >> std::hex >>y;

    int *pinter = (int*)y ;
    *pinter = 20;
    std::cout << "x After is equal "<< x <<std::endl;
}

这段代码应该绕过c++编译器将x变量类型设置为const int的概念,这样,指向变量的指针(在C中,指向常量的指针可以更改常量的值)和对变量的引用都不能更改变量,因此这段代码应该得到变量x的地址(当然在打印出来之后),然后指针完成其余的工作,所以我在这里做了什么,因为这个内存位置的接缝是硬件保护的(我知道它不是,但我很困惑)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-03 00:58:21

这段代码应该绕过c++编译器将x变量类型设置为const的概念,以便.

您可以破坏语言的规则,但是您的代码是无效的C++。您不应修改限定为const的内容。如果你这样做了,你就会有未定义的行为。因为编译器是用来编译有效的C++的,所以他们没有义务对非有效的代码做任何有意义的事情,结果可能是任何东西,也可能是什么都没有。

正如在评论中已经说过的:

const与硬件或内存无关。这是你和你的编译器达成的协议,你违反了这个协议。作为一种奖励,编译器将对代码做任何事情,但不一定是您所期望的。

您试图欺骗编译器,在运行时进行修改,以便编译器在编译时无法知道您将修改const。但是,您确实将x声明为const,因此编译器将假定其值不会更改。如果您仍然修改x的值,任何事情都可能发生。

PS:人们经常想出一些方法来“喜欢”private并不是真正的隐私,cosnt并不是真正的const和类似的东西。问题是:这些工具应该可以帮助您减少错误并编写更干净的代码。如果你试图绕过这些设施,你将设法做到这一点(有时甚至不调用UB)。然而,这种“预言”除了有可能射中自己的脚外,什么也没有。C++不是Java,它不握住你的手,试图防止你犯任何可能的错误。在这方面,C++更接近Pythons,“我们都是这里的成年人”。

票数 7
EN

Stack Overflow用户

发布于 2020-06-03 01:03:10

提供了以下内容: 1.注释不应该更改的值。2.允许编译器更好地优化代码,因为代码不应该更改。

你不需要跳过所有这些圈,你本可以用‘const_cast’来改变const‘’ness。

编译器“帮助”您执行const‘’ness,但是正如您所展示的,有许多方法可以绕过它。如果要更改const值,则会产生UB。

票数 2
EN

Stack Overflow用户

发布于 2020-06-03 02:04:38

它不能工作的原因(除了UB和编译器可能会优化代码,因为知道xconst)可能是因为如果您在64位系统上运行,int y无法保存x的地址。该地址最有可能是64位地址,其中一位是前32位的,而您的int最有可能是32位。

使用正确的类型来存储地址并创建x volatile const,您将仍然拥有UB --但它可能就像您所期望的那样工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <cstdint>
#include <iostream>

int main()
{
    volatile const int x = 10;    

    std::cout << "x Before is equal "<< x <<std::endl;

    std::uintptr_t y = (std::uintptr_t) &x;

    int *pinter = (int*) y;
    *pinter = 20;

    std::cout << "x After is equal "<< x <<std::endl;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62168728

复制
相关文章
统计单词
先解释一下,不要用空格来判断是否是下一个单词,比如good.yes.这是2个单词,要看出题人严不严,他也可以good.  yes.但是通用的方法如下,直接上题目
砖业洋__
2023/05/06
3210
统计单词
Linux下用来获取各种系统信息的C++类
下面是头文件内容,代码是mooon的一部分,对应的CPP文件请直接浏览:http://code.google.com/p/mooon/source/browse/trunk/common_library/src/sys/info.cpp
一见
2018/08/07
2.5K0
PHP发送邮件的一个类库
发送邮件其实是我们平常开发中算比较常见的一个需求吧。所以有必要稍微研究下,或者说找个好点的类库来使用,以备真要用到了又要重头开始学。
无道
2019/11/13
1.1K0
PHP发送邮件的一个类库
一个用来保存参数的容器类
import java.util.*; /**  * 提供一个保存参数的容器,用来给那些参数多、可选参数多、参数易变的方法提供参数读取能力。  * 直接使用Map等类对于数据类型处理不是方便。本类提供常用数据类型的读取方法。用法示例:<br>  * port = args.get("port",8080);<br>  * 放入Map中的port值可以是"8443"或new Integer(8443)或其他任何类型,只要toString()  * 能够解析出一个整数。  * @author sunlen  *
源哥
2018/08/28
3790
各种实用的 PHP 开源库推荐
PHP 是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域,是大多数后端开发者的首选。
用户7657330
2021/02/02
1.5K0
从Ndom语浅谈语言中的进制
这题粗看复杂,其实不然。首先不难看出,abo、an并不是数字,所以不是加法就是乘法。因为abo出现的十分多,所以我们可以简单地假设abo是加法。接下来需要确定进制。我们知道1-10的乘方之间,出现了三个单独的词。不难得出,肯定1个是1,一个是基数的平方。除了这两个,只剩一个单独的词,那么这个词只可能是2^2=4。由此我们可以确定,Ndom语言的数字表达的基数肯定大于4且小于9。因为nif为很多长词的开头,所以nif应该是基数的平方。在题2的等式我们发现meregh乘上sas结尾的词,结果竟然还是以meregh尾!所以很明显sas就是1,于是thonith就是4。接着找,就找到了余下几个小于基数的词(于abo、an之后的较小):ithin、meregh、thef(可能是2、3、5)。剩下的mer、nif、tondor估计就是基数的倍数了,通过观察nif abo tondor abo mer abo thonith,发现nif>tondor>mer。按照推论,mer abo ithin应该是第三小的数字——9,那么mer应该就是基数了。ithin肯定不是1、4,所以排除5、8进制可能。那么就只剩下6、7进制两种可能了。分析得mer an thef abo thonith是第4小的,即16。mer*thef+4=16⇒mer*thef=12。所以只有一种可能:Ndom语言的数字是6进制。所以mer为6,thef为2,nif是mer的平方即36,ithin是9-6=3。排除法得,meregh是5。最后还有一个tondor,通过推断tondor abo mer abo sas≥6*2+6+1=19最近的平方数是25,可以判断tondor是18。至此,我们已经推断完成所有的词。剩下就是一些小小的规则,比如表示72,并不是nif an thef,而是直接nif thef。还有就是大的数字一定会在前。所以我们就能写出:58=36+18+4也就是nif abo tondor abo thonith,而87=36*2+6*2+3即nif thef abo mer an thef abo ithin。参考答案:
KAAAsS
2022/01/13
11.1K0
从Ndom语浅谈语言中的进制
Python 的mapreduce 单词统计
#!/usr/bin/env python import random 'abc..z' alphaStr = "".join(map(chr, range(97,123))) fp = open("word.txt", "w") maxIter = 100000 for i in range(maxIter): word = "" len =random.randint(1,5) for j in range(len): word + = alphaStr[rand
好派笔记
2021/11/03
7160
[蓝桥杯][算法提高VIP]不同单词个数统计
思路:用STL set 很容易就解决了,算是复习了一下 #include<bits/stdc++.h> using namespace std; int main(){ set<string> st; string s; while(cin>>s){ st.insert(s); } cout<<st.size(); }
杨鹏伟
2020/09/11
1K0
05:统计单词数
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
attack
2018/04/03
1.3K0
HTML5-类库系列 类名的各种操作
HTML5学堂:最近讲师团队在学习JS类库的知识,因此就跟大家一起共享一下类库的搭建吧。今天要讲解的功能是:类名的各种操作。在这里,HTML5学堂提醒各位,不要心急,各种复杂的内容都是从简单的内容一步步调整优化过来的。今天我们在前一篇的基础上来优化我们的功能。 第一步 增加类名 addClass 增加类名应该说是这三种功能当中最简单的一个,类名是一个字符串,只需要使用字符串的连接就能够实现这个功能。 function addClass(obj, newClassName) { return obj.clas
HTML5学堂
2018/03/12
1.4K0
php开发_链接mysql数据库的一个类
项目结构: 运行效果; conn.php 1 <?php 2 class ConnectionMySQL{ 3 //主机 4 private $host="localhost"
Hongten
2018/09/13
1.5K0
php开发_链接mysql数据库的一个类
统计中的各种分布
1. 伯努利分布:伯努利分布:伯努利试验单次随机试验,只有"成功(值为1)"或"失败(值为0)"这两种结果。又名两点分布或者0-1分布。
小末快跑
2020/07/29
2.1K0
统计中的各种分布
26-统计单词个数
思路 在字符串中一个完整单词的特征? 空格前且空格前是字符 换行符前且空格前是字符 代码 #include <stdio.h> #include <string.h> #include <ctype.h> int count(char* s) { int n = strlen(s); int i = 0; int cnt = 0; for (i = 0; i < n; i++) { if (isalpha(s[i]) && (s[i + 1] == ' '
lexingsen
2022/02/25
7280
Android工具类库,满足你的各种需求
Download Gradle: implementation 'com.blankj:utilcode:1.29.0' // if u use AndroidX, use the following implementation 'com.blankj:utilcodex:1.29.0' APIs Activity 相关 -> ActivityUtils.java -> Demo addActivityLifecycleCallbacks : 新增 Activity 生命周期监听 removeAc
对话、
2022/02/22
1.4K0
问题 1505: [蓝桥杯][算法提高VIP]单词个数统计
题目描述 编写一个程序,输入一个字符串(长度不超过80),然后统计出该字符串当中包含有多少个单词。例如:字符串“this is a book”当中包含有4个单词。
且陶陶
2023/04/12
4750
python数学基础——单词统计
这个练习使用的是英文的单词统计,使用split通过单词中间的空格来做区分,在遍历的过程中通过对【字典】类型进行【字典推导式】的处理来计算每个单词出现的频次。但是由于过程中我们通过re的正则表达式来替换掉了很多的符号,并没有替换成空,故而空的数量应该是最多的。遍历的时候遇到''我们就跳过一下就行了。
红目香薰
2022/11/30
7310
python数学基础——单词统计
统计文章中单词个数
#include<stdio.h> #include<assert.h> int fun(const char* str) { assert(str != NULL); const char* p = str; int count = 0;//计数器 while(*p != '\0') { if(*p != ' ' && (*(p+1) == ' ' || *(p+1) == '\0')) { count
lexingsen
2022/02/24
6930
统计文件中出现的单词次数
这里以kevin.txt文件内容(单词由一个或多个空格字符分隔)为例进行简单说明 [root@centos6-test06 ~]# cat /root/kevin.txt the world kevin is the is world grace the kevin art the kevin the is kevin 统计kevin.txt文件中出现的单词次数 第一种方法:结合grep和awk编写shell脚本 脚本内容如下: [root@centos6-test06 ~]# cat count.sh
洗尽了浮华
2018/04/11
3.8K0
点击加载更多

相似问题

如何获取各种语言中最常用的单词列表?

10

使用domDocument类统计单词

11

PHP数字到单词西班牙语!

43

有没有现成的库或api可以用来分隔基于字符的语言中的单词?

10

PHP的数学统计库

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文