C_and_CPP 板


LINE

※ 引述《skyHuan (Huan)》之銘言: : 在寫程設矩陣乘法的題目的時候遇到一些問題 : 完整程式碼在這裡:https://pastebin.com/MxAUgHcY : 這是執行結果:https://i.imgur.com/TWB7cYL.png : 上面兩區塊是input,即一個2x3矩陣乘上一個3x4矩陣,最下面的區塊是相乘完的結果 : 中間兩個區塊是測試過程,也就是我的問題所在 : 以下列出我的問題,基本的程式觀念沒有很好,還請前輩們多多指教 : 1. 我的作法是先宣告出要存相乘結果的矩陣並初始化,如程式第18行 : 我記得二維陣列可以用 = {0} 來把全部的內容初始化為0 : 但做完第18行後,print出新宣告的陣列結果會是測試區塊的上面那塊 : 出現幾個很大的數字,感覺像是記憶體殘值(? : 用for迴圈重新設定每個為0之後才恢復正常全部都是0 : 是我 = {0} 的使用上有什麼沒注意到的嗎 在 C 語言中只有陣列這個概念, 沒有幾維的分別. 當你用下面幾種 方式來定義陣列, 概念上還是以巢狀陣列為主 (array of arrays), 這個概念很重要, 尤其在算位移的時候: int a[2]; // array of 2 ints int b[3][4]; // array of 3 int[4]s int c[4][5][6]; // array of 4 int[5][6]s 因此陣列元素 c[2] 的型別為 int[5][6], 記憶體位址為 (char*)&***c + 2 * sizeof(int[5][6]) ^ ^ ^ 第一個元素的位址 + 索引 * 每個元素的大小 另一個很重要的概念是: 陣列初始化只能初始前幾個元素, 剩下未 給值的元素都將用 zero bytes 填滿, 所以下面的初始化應該和你 所認知的不一樣: int a[3] = { -1 }; // { -1, 0, 0 } 一對大括號用來初始化一個陣列, 巢狀陣列則需要有對應層數的大 括號來初始化: int b[3][4] = { { -1 }, { }, { 5, 6, 7, 8 } }; /* b = { { -1, 0, 0, 0 }, { 0, 0, 0, 0 }, { 5, 6, 7, 8 } } */ 回到上一段所說的, 未給值的元素都會用 zero bytes 填滿, 如果 你就想要全部值都填 0, 像初始化 b[1] 那樣直接給空大括號即可 (全都不給初始值, 所以都用 zero bytes 來填). : 2. 宣告二維陣列大小的時候,大小是否可以用變數來表示 : 例如程式碼中的第7行中的m跟k1在scan後才能決定值 : 那第8行的二維陣列那樣宣告是合法的嗎,還是一定要用malloc的方式才行 : 我用自己電腦的IDE (CB)跟線上compiler (C99)跑都有過 : 但同學跑一模一樣的程式碼compiler不給過(VS) 可以, 但這需要你的編譯器支援 VLA (Variable-Length Array), 這是在 C99 才進的 feature, 因為目前 C 編譯器預設使用的語言 標準大多還是 C89/C90, 所以先確定你的編譯器有支援到 C99 並在 編譯時啟用. https://en.wikipedia.org/wiki/C99#Implementations 另外需要注意的是 VLA 的記憶體是放在 call stack 上, 使用的時 候小心別配置超過編譯器/環境允許的大小. --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 121.131.81.65
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1554230037.A.5FD.html
1F:推 skyHuan: 哇謝謝你還專程打這麼多超詳細的,幫我釐清了很多觀念 04/03 03:14
2F:→ adrianshum: (char*)&***c + 2 * sizeof(int[5][6]). 這段 04/03 09:21
3F:→ adrianshum: 有點不正常。首先cast 成char* 有點怪,我不熟C99 但 04/03 09:21
4F:→ adrianshum: 應該有int_8 或byte 之類?用這些比用char 比較能表達 04/03 09:21
5F:→ adrianshum: 你的目的。其次應該不用 &***c 吧?直接 c 或&c 就好 04/03 09:21
6F:→ adrianshum: 了。 04/03 09:21
7F:推 cutekid: c[2] 記憶體位址 = c + 2 04/03 13:11
有不同運算都可以算出相同的記憶體位址, 只是最後的型別不同, 語意也不一樣: 型別 敘述 int(*)[4][5][6] &c int(*)[5][6] c (decay 後) int(*)[5][6] c + 2 int[5][6] c[2] int[5][6] *c int[6] **c int ***c int* &***c ***c 語意上就是取得第一個 int 元素, sizeof(char) 的值為 1, 它扮演的角色就是你說的 byte. 先將 &***c 轉成 char* 確保往後 的指標運算都是以 byte 為單位 (int8_t 只是無 padding 的連續 8 個 bits, 但無法代表一個 byte). 所以最後整串敘述的語意為: c[2] 的位址是從第一個元素算起, 位移為 2int[5][6] 大小的地方 這邊把 sizeof 放進來是想表達指標運算的背後都和元素大小相關, 而元素大小是由指標型別來決定的, 無法單純靠索引來計算位移.
8F:推 cuteSquirrel: 推薦這篇文章 04/03 18:48
9F:→ adrianshum: 我明白你的目的,(char*)&***c 你的目的只是用一byte 04/04 14:53
10F:→ adrianshum: ptr 指向整個array 的起始位址而已。反正你都硬cast 04/04 14:53
11F:→ adrianshum: 成char* 了,用&c 或 decaying c 更能表達「整個arra 04/04 14:53
12F:→ adrianshum: y 的起始位址」的意思。 04/04 14:53
13F:推 adrianshum: 用char方面再查考之下的確較好,我一直有個錯誤印象 1 04/04 15:01
14F:→ adrianshum: char 未必是 1 byte 長。(怎麼標準不弄個 byte type 04/04 15:01
15F:→ adrianshum: 出來 :( ) 04/04 15:01
重點不是最後的值如何(方法有很多種), 而是過程中轉換過的型別 敘述 原始型別 結果型別 &c int(*)[4][5][6] char* c int[4][5][6] char* &***c int* char* 應該不用說明也可以看出差異在哪. 與其跟新手說「請你去算出 array of array of arrays的起始位址」, 個人覺得將陣列一步步 拆解, 扁平化, 再去算位移著實簡單得多.
16F:→ sarafciel: 他想表達的就是那個三層指標的原始型態啊 04/04 22:09
17F:→ sarafciel: 純粹用&c或c的話會讓人以為int[4][5][6]就是拿單指標接 04/04 22:12
18F:→ sarafciel: 新手的話更容易踩這種陷阱 04/04 22:13
嗚嗚, 握手 QQ
19F:→ sarafciel: 是說就是因為這樣 我都不寫int[4][5][6]這種型態 04/04 22:17
20F:→ sarafciel: 寧願弄成int[4*5*6]來做事 頂多下標麻煩一點(逃) 04/04 22:19
※ 編輯: poyenc (121.131.81.65), 04/05/2019 04:18:04







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燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP