99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

徐土豆
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
c語(yǔ)言運(yùn)行時(shí)出現(xiàn)segment fault的原因
一文理解C語(yǔ)言中的volatile修飾符
C語(yǔ)言中的內(nèi)存布局(memory layout)
do{}while(false)結(jié)構(gòu)的妙用
const修飾符并不保證運(yùn)行時(shí)的常數(shù)性質(zhì)
引用與指針的區(qū)別
作者動(dòng)態(tài) 更多
給定計(jì)算預(yù)算下的最佳LLM模型尺寸與預(yù)訓(xùn)練數(shù)據(jù)量分配
05-19 09:33
大模型推理時(shí)的尺度擴(kuò)展定律
05-18 10:32
世界多胞體與世界模型
05-13 09:42
獎(jiǎng)勵(lì)模型中的尺度擴(kuò)展定律和獎(jiǎng)勵(lì)劫持
05-12 08:41
MeCo——給預(yù)訓(xùn)練數(shù)據(jù)增加源信息,就能減少33%的訓(xùn)練量并且提升效果
05-08 09:13

const修飾符并不保證運(yùn)行時(shí)的常數(shù)性質(zhì)

本文轉(zhuǎn)自徐飛翔的“const修飾符并不保證運(yùn)行時(shí)的常數(shù)性質(zhì)

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

const和volatile修飾符統(tǒng)稱為cv修飾符,用于指示編譯器是否允許一個(gè)程序中的某個(gè)變量的內(nèi)存是否在初始化后,仍允許被修改。其中的volatile我們已經(jīng)在前文[1]中討論過(guò)了,我們討論下const的一些特性。我們知道,cv修飾符都是給編譯器看的,用于指導(dǎo)編譯過(guò)程中的優(yōu)化(如volatile)或者用戶非法變量修改行為(如const),因此這倆個(gè)修飾符只能保證編譯時(shí)的操作合乎設(shè)計(jì)時(shí)候的需求,但是如果涉及到運(yùn)行時(shí)(running time)的一些操作,是無(wú)法保證的。我們本文討論const修飾后的變量,被運(yùn)行時(shí)『修改』的例子。

如果我們正常使用const,理應(yīng)如下所示:

const int var = 10;
int var_b = 100;

var = 100; // 非法操作,因?yàn)関ar是const類型,初始化后不能被修改。
var_b = 10; // 合法操作,正常的賦值

然而,我們不能確保運(yùn)行時(shí),被const修飾的變量?jī)?nèi)存,被其他程序,或者自行設(shè)計(jì)錯(cuò)誤,或者黑客行為修改,舉個(gè)例:

#include <stdio.h>
int main(void) {
	int a = 10;
	const int b = 9;
	int c = 8;
	printf("%d\t%d\t%d\n\r", a, b, c);
	
	int* pa = &a;
	const int* pb = &b;
	int* pc = &c;	
	printf("%x\t%x\t%x\n\r", pa,pb,pc);
	
	*(pa+1) = 100; // modify the first time
	printf("%d\n\r", *(pa+1));
	*(pc-1) = 300;
	printf("%x\t%x\t\n\r", (pa+1), (pc-1));
	printf("%d\n\r", (pa+1) == (pc-1));
	printf("%d\n\r", (pa+1) == pb);
	printf("%d\t%d\t%d\t%d\n\r",a,*(pa+1),c,*(pb));
	return 0;
}

用g++ test_const.cpp編譯,用./a.out輸出結(jié)果,代碼輸出為:在這里插入圖片描述

我們可以發(fā)現(xiàn),通過(guò)棧[2]上相鄰的變量的地址做偏移,可以實(shí)現(xiàn)間接地對(duì)const修飾的變量進(jìn)行修改,這種行為會(huì)意料之外的修改常量,非常的危險(xiǎn),我們的代碼中需要檢查涉及到指針偏移的操作,檢查是否會(huì)出現(xiàn)越界的情況。

注意到,如果代碼中的輸出從:

printf("%d\t%d\t%d\t%d\n\r",a,*(pa+1),c,*(pb));

改成

printf("%d\t%d\t%d\t%d\n\r",a,*(pa+1),c,b);

結(jié)果是不一樣的,后者的結(jié)果仍然是輸出b = 9,那是因?yàn)镃++在編譯時(shí)對(duì)常量進(jìn)行折疊,因此直接輸出3這個(gè)立即數(shù)了,而不是從內(nèi)存里面取出常量再輸出,這一點(diǎn)要注意。Reference

[1]. https://blog.csdn.net/LoseInVain/article/details/103356324

[2]. https://blog.csdn.net/LoseInVain/article/details/103183829

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 2
關(guān)注 52
成為作者 賺取收益
全部留言
0/200
  • dy-J4n9lg5Q 2021-05-19 13:29
    思路清晰,受益匪淺
    回復(fù)
主站蜘蛛池模板: 亚洲天堂avtt | 中国一级毛片免费看 | 成人免费在线观看网站 | 亚洲不卡在线视频 | 性色av一区二区三区四区 | 伊人夜色| 91九色超碰 | 女性喷液过免费视频 | 激情偷乱人伦小说视频在线精 | 日韩a级毛片免费视频 | 亚洲国产精品成人天堂 | 巨大欧美黑人XXXXBBBB | 国产av一二三 | 四虎国产精品成人 | 男人疯狂进入女人下部动态图 | 超碰在线a | 男人女人做爽爽18禁免费 | 96成人爽a毛片一区二区 | 影音先锋色中色 | 十八岁免禁止免费播放 | 日日碰狠狠躁久久躁 | 四虎新网址 | 国产成人无精品久久久 | 久草免费资源 | 国产自偷自拍 | 日韩欧美在 | 精品亚洲国产成人A片在线鸭王 | 国产精妇在线观看第一区 | 欲色欲色天天天WWW 天堂网在线WWW最新版资源 | 欧美乱强伦XXXXX高潮 | 国产精品成人亚洲一区二区 | 亚洲九色| 久久中文字幕精品 | 无码人妻精品中文字幕 | 久久久久国产精品一区二区三区 | 学生在线精品一区二区 | 欧美日视频 | 久久久久久久福利 | 日韩视频一区尤物少妇偷拍 | 国产精品久久久久久人妻精品 | 精品无码国产污污污免费网站 |