sta*_*tti 6 c c++ arrays undefined-behavior
在我写的算法中,我可以得到以下内容(当然简化)
int a[3] = {1,2,3};
int b = a[3];
Run Code Online (Sandbox Code Playgroud)
当索引用于填充b溢出时,我从不使用b的值.代码仍然不正确吗?我是否必须进行明确的边界检查?
无论您是否使用此代码都具有未定义的行为b.为什么?因为a[3]相当于*(a+3)定义.这里引用了标准,证明了*(a+3)它本身是未定义的,无论值是存储,使用还是单独保留.
当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型.如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向偏离原始元素的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式.换句话说,如果表达式P指向数组对象的第i个元素,则表达式(P)+ N(等效地,N +(P))和(P)-N(其中N具有值n)指向分别为数组对象的第i + n和第i-n个元素,只要它们存在.此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素,如果表达式Q指向一个超过数组对象的最后一个元素,表达式(Q)-1指向数组对象的最后一个元素.如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定.