[问题] 此段程式哪里有问题

楼主: chiya1908 (leowu)   2024-03-08 16:44:54
开发平台(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没办法给出正确的回答 上来请教各位大大 再麻烦帮忙解惑了
作者: nh60211as   2024-03-08 17:40:00
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
作者: amamoimi (佛仔)   2024-03-08 17:52:00
number==0直接就不会进循环了吧
楼主: chiya1908 (leowu)   2024-03-08 17:57:00
考题有if 这是我直接复制下来的我也记得他好像是说number的地方要改
作者: simon860730 (╰电磁学╮╭爆炸囉╯)   2024-03-08 18:06:00
for里面的条件改成 i < number 应该连if都不用包了
作者: nh60211as   2024-03-08 19:33:00
int 比 uint 还是要转型,那就有可能不是你预期的比较结果阿抱歉看错
作者: KaryuuIssen (一闪)   2024-03-08 19:34:00
逻辑上没什么问题 难道他是希望你把number和i的型别换成size_t ?
作者: nh60211as   2024-03-08 20:00:00
实际跑了一下,好像 clean_buffer(int* A, unsigned比较像正常的写法
作者: Richun (解放左手的OO之力)   2024-03-08 20:26:00
该不会是说int不一定对齐内存大小,要用unsigned long吧有可能就是K大讲的那个,要size_t去对到CPU寻址能力。
作者: stupid0319 (征女友)   2024-03-08 21:11:00
可能要检查 A != NULL 吧
作者: Dracarys (MayShowGunMore)   2024-03-08 22:21:00
答案应该是unsigned int有可能无法表达std::size_t所有的数,可以用T (&A)[N]https://godbolt.org/z/GMxdPcrYzint* A比较正常的说法听起来怪怪的,因为本来就一样https://eel.is/c++draft/dcl.fct#5.sentence-3
作者: 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?
作者: sanctitysky (常自在)   2024-03-18 02:50:00
会计算 n+1次 n-1 很浪费效能?还是char*?for buffer?
作者: ddavid (谎言接线生)   2024-03-18 12:39:00
number 为 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]会位移爆掉?

Links booklink

Contact Us: admin [ a t ] ucptt.com