C_and_CPP 板


LINE

开发平台(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没办法给出正确的回答 上来请教各位大大 再麻烦帮忙解惑了 --
QR Code



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 163.116.222.124 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1709887496.A.B2B.html
1F:→ nh60211as: number - 1 遇到 number==0 会 overflow 03/08 17:40
2F:推 gusion: code看起来好像没问题,不过可以简化,if判断拿掉,for的 03/08 17:48
3F:→ gusion: 条件改成i < number看起来比较乾净 03/08 17:48
4F:→ firejox: 考题应该没有if 03/08 17:51
5F:推 amamoimi: number==0直接就不会进回圈了吧 03/08 17:52
6F:→ chiya1908: 考题有if 这是我直接复制下来的 03/08 17:57
7F:→ chiya1908: 我也记得他好像是说number的地方要改 03/08 17:58
8F:推 simon860730: for里面的条件改成 i < number 应该连if都不用包了 03/08 18:06
9F:→ nh60211as: int 比 uint 还是要转型,那就有可能不是你预期的比较 03/08 19:33
10F:→ nh60211as: 结果 03/08 19:33
11F:→ nh60211as: 阿抱歉看错 03/08 19:34
12F:推 KaryuuIssen: 逻辑上没什麽问题 难道他是希望你把number和i的型别 03/08 19:34
13F:→ KaryuuIssen: 换成size_t ? 03/08 19:34
14F:→ nh60211as: 实际跑了一下,好像 clean_buffer(int* A, unsigned 03/08 20:00
15F:→ nh60211as: 比较像正常的写法 03/08 20:00
16F:推 Richun: 该不会是说int不一定对齐记忆体大小,要用unsigned long吧 03/08 20:26
17F:→ Richun: 有可能就是K大讲的那个,要size_t去对到CPU定址能力。 03/08 20:28
18F:推 stupid0319: 可能要检查 A != NULL 吧 03/08 21:11
19F:推 Dracarys: 答案应该是unsigned int有可能无法表达std::size_t所有 03/08 22:21
20F:→ Dracarys: 的数,可以用T (&A)[N] 03/08 22:21
21F:→ Dracarys: https://godbolt.org/z/GMxdPcrYz 03/08 22:21
22F:推 Dracarys: int* A比较正常的说法听起来怪怪的,因为本来就一样 03/08 22:24
23F:→ Dracarys: https://eel.is/c++draft/dcl.fct#5.sentence-3 03/08 22:24
24F:推 wulouise: 没说这题是考c还是c++啊 03/08 22:48
25F:→ peter98: 会不会是你记错题目? 考题里的i是不是int而不是你记得的 03/09 05:41
26F:→ peter98: unsigned int? 如果i的型别是int的话会有问题 03/09 05:42
27F:→ peter98: 但我想想又有矛盾,如果是因为i的型别为int而造成的over 03/09 05:55
28F:→ peter98: flow,那那个number会很大,而这个number又是array size 03/09 05:55
29F:→ peter98: 理论上应该没这麽大的array才对。。。 03/09 05:56
30F:→ peter98: 如果array是动态配置的可能可以,但如果array是动态配置 03/09 05:59
31F:→ peter98: function参数写int []我会想砍人 03/09 05:59
32F:→ cylee: 是我的话会用 memset;不过搞不好是禁用? 03/09 11:06
33F:推 wulouise: 我觉得这题应该要问Caller 03/09 17:20
34F:推 shibin: 认同一楼说的,number==0会变无穷回圈 03/10 00:39
35F:推 chuegou: 认同上面两楼 问caller 03/10 22:00
36F:推 manmay: 如果是说未定义记忆体位置有说阵列长度为多少吗 03/11 19:56
37F:→ manmay: number-1的索引 03/11 19:56
38F:→ manmay: 是否超过原本阵列的大小 03/11 19:56
39F:推 hongsiangfu: number过大会造成A位址回卷,因为A不是对齐bit0(猜 03/12 09:03
40F:推 rnoro: 认同一楼,unsigned int的-1是-1的补数,通常非常非常大XD 03/13 08:17
41F:推 joefaq: number == UINT_MAX 会变无穷回圈 03/17 04:29
42F:推 wulouise: 外面有number>0,overflow的情况里面不会出现吧 03/17 19:20
43F:→ Lipraxde: 你会不会其实不小心把答案跟题目弄反了?一般用 unsign 03/17 20:23
44F:→ Lipraxde: ed 可能写成 for (unsigned i; i < n; ++i),没意识到 03/17 20:23
45F:→ Lipraxde: n 可能是 0? 03/17 20:23
46F:推 sanctitysky: 会计算 n+1次 n-1 很浪费效能? 03/18 02:50
47F:推 sanctitysky: 还是char*?for buffer? 03/18 02:53
48F:推 ddavid: number 为 0 就已经被 if(number > 0) 挡掉了,不会出事啊 03/18 12:39
49F:→ ddavid: 至於 number 过大,原Po已经说「考官有提到number 跟 03/18 12:39
50F:→ ddavid: array A[] 的size是一样的」,你要搞出一个 stack 宣告得 03/18 12:43
51F:→ ddavid: 出来但是 unsigned int 存不下的阵列大小? 03/18 12:43
52F:推 ddavid: 因为是 int 阵列,似乎需要 > 16GB 的 stack 大小呢XD 03/18 12:50
53F:→ ddavid: 在这之前,这个阵列要怎麽宣告出来XD 03/18 12:51
54F:推 shibin: 喔喔,那个if被我无视了,那应该不是这问题 03/18 17:01
55F:推 Fenikso: 为什麽一定要放stack XD 03/20 22:28
56F:推 adamkk: 看不出来,就算是alignment的问题,array的记忆体位置也会 04/03 23:15
57F:→ adamkk: shift到对的位置。目前看得比较会是i <= number - 1的编译 04/03 23:16
58F:→ adamkk: 顺序会不会不一样 04/03 23:19
59F:推 wulouise: 看起来最有可能的是caller给的size会超过uint吧,清不乾 04/04 17:04
60F:→ wulouise: 净 04/04 17:04
61F:→ firejox: 我有点好奇是否有因为optimization 省略if的情况 04/05 08:40
62F:推 LPH66: 最佳化的话可能要编译器能 (1) 把回圈化简成 memset 之後 04/05 23:57
63F:→ LPH66: (2) 这个函数被 inline (3) if 的条件在上层函数已满足 04/05 23:57
64F:→ LPH66: 不过 (3) 这个条件记得不容易满足 (技术上&实际程式上都是) 04/05 23:59
65F:→ firejox: 了解,仔细想caller给的size超过unsigned是有可能的,以 04/06 21:31
66F:→ firejox: c标准而言,unsigned是有可能16bit的。 04/06 21:31
67F:推 bizer: 会不会是number给的size是byte,也就是 sizeof (unsigned in 04/19 11:04
68F:→ bizer: t)计算byte,但你是用unsigned int去做index所以会爆掉? 04/19 11:04
69F:→ bizer: int A[i]会位移爆掉? 04/19 11:06
70F:推 adamkk: 会不会跟32bit记忆体定址有关? 05/18 23:44







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP