[問題] 此段程式哪裡有問題

看板C_and_CPP (C/C++)作者 (leowu)時間8月前 (2024/03/08 16:44), 編輯推噓28(28042)
留言70則, 26人參與, 6月前最新討論串1/1
開發平台(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沒辦法給出正確的回答 上來請教各位大大 再麻煩幫忙解惑了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 163.116.222.124 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1709887496.A.B2B.html

03/08 17:40, 8月前 , 1F
number - 1 遇到 number==0 會 overflow
03/08 17:40, 1F

03/08 17:48, 8月前 , 2F
code看起來好像沒問題,不過可以簡化,if判斷拿掉,for的
03/08 17:48, 2F

03/08 17:48, 8月前 , 3F
條件改成i < number看起來比較乾淨
03/08 17:48, 3F

03/08 17:51, 8月前 , 4F
考題應該沒有if
03/08 17:51, 4F

03/08 17:52, 8月前 , 5F
number==0直接就不會進迴圈了吧
03/08 17:52, 5F

03/08 17:57, 8月前 , 6F
考題有if 這是我直接複製下來的
03/08 17:57, 6F

03/08 17:58, 8月前 , 7F
我也記得他好像是說number的地方要改
03/08 17:58, 7F

03/08 18:06, 8月前 , 8F
for裡面的條件改成 i < number 應該連if都不用包了
03/08 18:06, 8F

03/08 19:33, 8月前 , 9F
int 比 uint 還是要轉型,那就有可能不是你預期的比較
03/08 19:33, 9F

03/08 19:33, 8月前 , 10F
結果
03/08 19:33, 10F

03/08 19:34, 8月前 , 11F
阿抱歉看錯
03/08 19:34, 11F

03/08 19:34, 8月前 , 12F
邏輯上沒什麼問題 難道他是希望你把number和i的型別
03/08 19:34, 12F

03/08 19:34, 8月前 , 13F
換成size_t ?
03/08 19:34, 13F

03/08 20:00, 8月前 , 14F
實際跑了一下,好像 clean_buffer(int* A, unsigned
03/08 20:00, 14F

03/08 20:00, 8月前 , 15F
比較像正常的寫法
03/08 20:00, 15F

03/08 20:26, 8月前 , 16F
該不會是說int不一定對齊記憶體大小,要用unsigned long吧
03/08 20:26, 16F

03/08 20:28, 8月前 , 17F
有可能就是K大講的那個,要size_t去對到CPU定址能力。
03/08 20:28, 17F

03/08 21:11, 8月前 , 18F
可能要檢查 A != NULL 吧
03/08 21:11, 18F

03/08 22:21, 8月前 , 19F
答案應該是unsigned int有可能無法表達std::size_t所有
03/08 22:21, 19F

03/08 22:21, 8月前 , 20F
的數,可以用T (&A)[N]
03/08 22:21, 20F

03/08 22:21, 8月前 , 21F

03/08 22:24, 8月前 , 22F
int* A比較正常的說法聽起來怪怪的,因為本來就一樣
03/08 22:24, 22F

03/08 22:24, 8月前 , 23F

03/08 22:48, 8月前 , 24F
沒說這題是考c還是c++啊
03/08 22:48, 24F

03/09 05:41, 8月前 , 25F
會不會是你記錯題目? 考題裡的i是不是int而不是你記得的
03/09 05:41, 25F

03/09 05:42, 8月前 , 26F
unsigned int? 如果i的型別是int的話會有問題
03/09 05:42, 26F

03/09 05:55, 8月前 , 27F
但我想想又有矛盾,如果是因為i的型別為int而造成的over
03/09 05:55, 27F

03/09 05:55, 8月前 , 28F
flow,那那個number會很大,而這個number又是array size
03/09 05:55, 28F

03/09 05:56, 8月前 , 29F
理論上應該沒這麼大的array才對。。。
03/09 05:56, 29F

03/09 05:59, 8月前 , 30F
如果array是動態配置的可能可以,但如果array是動態配置
03/09 05:59, 30F

03/09 05:59, 8月前 , 31F
function參數寫int []我會想砍人
03/09 05:59, 31F

03/09 11:06, 8月前 , 32F
是我的話會用 memset;不過搞不好是禁用?
03/09 11:06, 32F

03/09 17:20, 8月前 , 33F
我覺得這題應該要問Caller
03/09 17:20, 33F

03/10 00:39, 8月前 , 34F
認同一樓說的,number==0會變無窮迴圈
03/10 00:39, 34F

03/10 22:00, 8月前 , 35F
認同上面兩樓 問caller
03/10 22:00, 35F

03/11 19:56, 8月前 , 36F
如果是說未定義記憶體位置有說陣列長度為多少嗎
03/11 19:56, 36F

03/11 19:56, 8月前 , 37F
number-1的索引
03/11 19:56, 37F

03/11 19:56, 8月前 , 38F
是否超過原本陣列的大小
03/11 19:56, 38F

03/12 09:03, 8月前 , 39F
number過大會造成A位址回卷,因為A不是對齊bit0(猜
03/12 09:03, 39F

03/13 08:17, 8月前 , 40F
認同一樓,unsigned int的-1是-1的補數,通常非常非常大XD
03/13 08:17, 40F

03/17 04:29, 8月前 , 41F
number == UINT_MAX 會變無窮迴圈
03/17 04:29, 41F

03/17 19:20, 8月前 , 42F
外面有number>0,overflow的情況裡面不會出現吧
03/17 19:20, 42F

03/17 20:23, 8月前 , 43F
你會不會其實不小心把答案跟題目弄反了?一般用 unsign
03/17 20:23, 43F

03/17 20:23, 8月前 , 44F
ed 可能寫成 for (unsigned i; i < n; ++i),沒意識到
03/17 20:23, 44F

03/17 20:23, 8月前 , 45F
n 可能是 0?
03/17 20:23, 45F

03/18 02:50, 8月前 , 46F
會計算 n+1次 n-1 很浪費效能?
03/18 02:50, 46F

03/18 02:53, 8月前 , 47F
還是char*?for buffer?
03/18 02:53, 47F

03/18 12:39, 8月前 , 48F
number 為 0 就已經被 if(number > 0) 擋掉了,不會出事啊
03/18 12:39, 48F

03/18 12:39, 8月前 , 49F
至於 number 過大,原Po已經說「考官有提到number 跟
03/18 12:39, 49F

03/18 12:43, 8月前 , 50F
array A[] 的size是一樣的」,你要搞出一個 stack 宣告得
03/18 12:43, 50F

03/18 12:43, 8月前 , 51F
出來但是 unsigned int 存不下的陣列大小?
03/18 12:43, 51F

03/18 12:50, 8月前 , 52F
因為是 int 陣列,似乎需要 > 16GB 的 stack 大小呢XD
03/18 12:50, 52F

03/18 12:51, 8月前 , 53F
在這之前,這個陣列要怎麼宣告出來XD
03/18 12:51, 53F

03/18 17:01, 8月前 , 54F
喔喔,那個if被我無視了,那應該不是這問題
03/18 17:01, 54F

03/20 22:28, 8月前 , 55F
為什麼一定要放stack XD
03/20 22:28, 55F

04/03 23:15, 7月前 , 56F
看不出來,就算是alignment的問題,array的記憶體位置也會
04/03 23:15, 56F

04/03 23:16, 7月前 , 57F
shift到對的位置。目前看得比較會是i <= number - 1的編譯
04/03 23:16, 57F

04/03 23:19, 7月前 , 58F
順序會不會不一樣
04/03 23:19, 58F

04/04 17:04, 7月前 , 59F
看起來最有可能的是caller給的size會超過uint吧,清不乾
04/04 17:04, 59F

04/04 17:04, 7月前 , 60F
04/04 17:04, 60F

04/05 08:40, 7月前 , 61F
我有點好奇是否有因為optimization 省略if的情況
04/05 08:40, 61F

04/05 23:57, 7月前 , 62F
最佳化的話可能要編譯器能 (1) 把迴圈化簡成 memset 之後
04/05 23:57, 62F

04/05 23:57, 7月前 , 63F
(2) 這個函數被 inline (3) if 的條件在上層函數已滿足
04/05 23:57, 63F

04/05 23:59, 7月前 , 64F
不過 (3) 這個條件記得不容易滿足 (技術上&實際程式上都是)
04/05 23:59, 64F

04/06 21:31, 7月前 , 65F
了解,仔細想caller給的size超過unsigned是有可能的,以
04/06 21:31, 65F

04/06 21:31, 7月前 , 66F
c標準而言,unsigned是有可能16bit的。
04/06 21:31, 66F

04/19 11:04, 7月前 , 67F
會不會是number給的size是byte,也就是 sizeof (unsigned in
04/19 11:04, 67F

04/19 11:04, 7月前 , 68F
t)計算byte,但你是用unsigned int去做index所以會爆掉?
04/19 11:04, 68F

04/19 11:06, 7月前 , 69F
int A[i]會位移爆掉?
04/19 11:06, 69F

05/18 23:44, 6月前 , 70F
會不會跟32bit記憶體定址有關?
05/18 23:44, 70F
文章代碼(AID): #1bwj08ih (C_and_CPP)
文章代碼(AID): #1bwj08ih (C_and_CPP)