开发平台(Platform): (Ex: Win10, Linux, ...)
windows
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
NO
问题(Question):
此段程式有什么risks 跟 如何改进他
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
void clean_buffer(int A[], unsigned int number){
unsigned int i;
if(number > 0){
for(i = 0; i <= number - 1; i++){
A[i] = 0;
}
}
}
这题是去年在NV面试时遇到的考题
考官有提到number 跟 array A[] 的size是一样的
但答案是跟 overflow 或是 踩到未定义内存位址有关系
实在是忘记当初的答案 最近想到这题实在是太想知道答案
无奈chatgpt没办法给出正确的回答 上来请教各位大大 再麻烦帮忙解惑了
number - 1 遇到 number==0 会 overflow
作者: gusion 2024-03-08 17:48:00
code看起来好像没问题,不过可以简化,if判断拿掉,for的条件改成i < number看起来比较干净
作者:
firejox (Tangent)
2024-03-08 17:51:00考题应该没有if
考题有if 这是我直接复制下来的我也记得他好像是说number的地方要改
for里面的条件改成 i < number 应该连if都不用包了
int 比 uint 还是要转型,那就有可能不是你预期的比较结果阿抱歉看错
逻辑上没什么问题 难道他是希望你把number和i的型别换成size_t ?
实际跑了一下,好像 clean_buffer(int* A, unsigned比较像正常的写法
作者:
Richun (解放左手的OO之力)
2024-03-08 20:26:00该不会是说int不一定对齐内存大小,要用unsigned long吧有可能就是K大讲的那个,要size_t去对到CPU寻址能力。
作者:
wulouise (在线上!=在电脑前)
2024-03-08 22:48:00没说这题是考c还是c++啊
作者:
peter98 (新兵)
2024-03-09 05:41:00会不会是你记错题目? 考题里的i是不是int而不是你记得的unsigned int? 如果i的型别是int的话会有问题但我想想又有矛盾,如果是因为i的型别为int而造成的overflow,那那个number会很大,而这个number又是array size理论上应该没这么大的array才对。。。如果array是动态配置的可能可以,但如果array是动态配置function参数写int []我会想砍人
作者:
cylee (Artisan)
2024-03-09 11:06:00是我的话会用 memset;不过搞不好是禁用?
作者:
wulouise (在线上!=在电脑前)
2024-03-09 17:20:00我觉得这题应该要问Caller
作者: shibin (喜饼) 2024-03-10 00:39:00
认同一楼说的,number==0会变无穷循环
作者:
chuegou (chuegou)
2024-03-10 22:00:00认同上面两楼 问caller
作者: manmay (书诚) 2024-03-11 19:56:00
如果是说未定义内存位置有说阵列长度为多少吗number-1的索引是否超过原本阵列的大小
作者: hongsiangfu 2024-03-12 09:03:00
number过大会造成A位址回卷,因为A不是对齐bit0(猜
作者:
rnoro (隼)
2024-03-13 08:17:00认同一楼,unsigned int的-1是-1的补数,通常非常非常大XD
作者: joefaq (小瑜) 2024-03-17 04:29:00
number == UINT_MAX 会变无穷循环
作者:
wulouise (在线上!=在电脑前)
2024-03-17 19:20:00外面有number>0,overflow的情况里面不会出现吧
作者:
Lipraxde (Lipraxde)
2024-03-17 20:23:00你会不会其实不小心把答案跟题目弄反了?一般用 unsigned 可能写成 for (unsigned i; i < n; ++i),没意识到n 可能是 0?
会计算 n+1次 n-1 很浪费效能?还是char*?for buffer?
作者:
ddavid (谎言接线生)
2024-03-18 12:39:00number 为 0 就已经被 if(number > 0) 挡掉了,不会出事啊至于 number 过大,原Po已经说“考官有提到number 跟array A[] 的size是一样的”,你要搞出一个 stack 宣告得出来但是 unsigned int 存不下的阵列大小?因为是 int 阵列,似乎需要 > 16GB 的 stack 大小呢XD在这之前,这个阵列要怎么宣告出来XD
作者: shibin (喜饼) 2024-03-18 17:01:00
喔喔,那个if被我无视了,那应该不是这问题
作者:
Fenikso (薪水小偷)
2024-03-20 22:28:00为什么一定要放stack XD
作者: adamkk (爱还记得吗) 2024-04-03 23:15:00
看不出来,就算是alignment的问题,array的内存位置也会shift到对的位置。目前看得比较会是i <= number - 1的编译顺序会不会不一样
作者:
wulouise (在线上!=在电脑前)
2024-04-04 17:04:00看起来最有可能的是caller给的size会超过uint吧,清不干净
作者:
firejox (Tangent)
2024-04-05 08:40:00我有点好奇是否有因为optimization 省略if的情况
作者:
LPH66 (-6.2598534e+18f)
2024-04-05 23:57:00最佳化的话可能要编译器能 (1) 把循环化简成 memset 之后(2) 这个函数被 inline (3) if 的条件在上层函数已满足不过 (3) 这个条件记得不容易满足 (技术上&实际程式上都是)
作者:
firejox (Tangent)
2024-04-06 21:31:00了解,仔细想caller给的size超过unsigned是有可能的,以c标准而言,unsigned是有可能16bit的。
作者: bizer (bizer) 2024-04-19 11:04:00
会不会是number给的size是byte,也就是 sizeof (unsigned int)计算byte,但你是用unsigned int去做index所以会爆掉?int A[i]会位移爆掉?
作者: adamkk (爱还记得吗) 2024-05-18 23:44:00
会不会跟32bit内存寻址有关?