※ 本文轉寄自 ptt.cc, 文章原始頁面
看板C_and_CPP
標題

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

最新2024-03-12 09:03:00
留言39則留言,17人參與討論
推噓14 ( 14025 )
開發平台(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

39 則留言

nh60211as, 1F
number - 1 遇到 number==0 會 overflow

gusion, 2F
code看起來好像沒問題,不過可以簡化,if判斷拿掉,for的

gusion, 3F
條件改成i < number看起來比較乾淨

firejox, 4F
考題應該沒有if

amamoimi, 5F
number==0直接就不會進迴圈了吧

chiya1908, 6F
考題有if 這是我直接複製下來的

chiya1908, 7F
我也記得他好像是說number的地方要改

simon860730, 8F
for裡面的條件改成 i < number 應該連if都不用包了

nh60211as, 9F
int 比 uint 還是要轉型,那就有可能不是你預期的比較

nh60211as, 10F
結果

nh60211as, 11F
阿抱歉看錯

KaryuuIssen, 12F
邏輯上沒什麼問題 難道他是希望你把number和i的型別

KaryuuIssen, 13F
換成size_t ?

nh60211as, 14F
實際跑了一下,好像 clean_buffer(int* A, unsigned

nh60211as, 15F
比較像正常的寫法

Richun, 16F
該不會是說int不一定對齊記憶體大小,要用unsigned long吧

Richun, 17F
有可能就是K大講的那個,要size_t去對到CPU定址能力。

stupid0319, 18F
可能要檢查 A != NULL 吧

Dracarys, 19F
答案應該是unsigned int有可能無法表達std::size_t所有

Dracarys, 20F
的數,可以用T (&A)[N]

Dracarys, 21F

Dracarys, 22F
int* A比較正常的說法聽起來怪怪的,因為本來就一樣

wulouise, 24F
沒說這題是考c還是c++啊

peter98, 25F
會不會是你記錯題目? 考題裡的i是不是int而不是你記得的

peter98, 26F
unsigned int? 如果i的型別是int的話會有問題

peter98, 27F
但我想想又有矛盾,如果是因為i的型別為int而造成的over

peter98, 28F
flow,那那個number會很大,而這個number又是array size

peter98, 29F
理論上應該沒這麼大的array才對。。。

peter98, 30F
如果array是動態配置的可能可以,但如果array是動態配置

peter98, 31F
function參數寫int []我會想砍人

cylee, 32F
是我的話會用 memset;不過搞不好是禁用?

wulouise, 33F
我覺得這題應該要問Caller

shibin, 34F
認同一樓說的,number==0會變無窮迴圈

chuegou, 35F
認同上面兩樓 問caller

manmay, 36F
如果是說未定義記憶體位置有說陣列長度為多少嗎

manmay, 37F
number-1的索引

manmay, 38F
是否超過原本陣列的大小

hongsiangfu, 39F
number過大會造成A位址回卷,因為A不是對齊bit0(猜