char陣列初始化 在 大象中醫 Youtube 的最佳貼文
char陣列初始化 在 大象中醫 Youtube 的最佳解答
char陣列初始化 在 33 字元陣列與字串- YouTube 的美食出口停車場
33 字元 陣列 與字串. Watch later. Share. Copy link. Info. Shopping. Tap to unmute. If playback doesn't begin shortly, try restarting your ... ... <看更多>
char陣列初始化 在 Re: [問題] 二維陣列初始化問題- 看板C_and_CPP - 批踢踢實業坊 的美食出口停車場
※ 引述《skyHuan (Huan)》之銘言:
: 在寫程設矩陣乘法的題目的時候遇到一些問題
: 完整程式碼在這裡:https://pastebin.com/MxAUgHcY
: 這是執行結果:
: 上面兩區塊是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://www.ptt.cc/bbs/C_and_CPP/M.1554230037.A.5FD.html
語意也不一樣:
型別 敘述
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] 的位址是從第一個元素算起, 位移為 2 個
int[5][6] 大小的地方
這邊把 sizeof 放進來是想表達指標運算的背後都和元素大小相關,
而元素大小是由指標型別來決定的, 無法單純靠索引來計算位移.
敘述 原始型別 結果型別
&c int(*)[4][5][6] char*
c int[4][5][6] char*
&***c int* char*
應該不用說明也可以看出差異在哪. 與其跟新手說「請你去算出
array of array of arrays的起始位址」, 個人覺得將陣列一步步
拆解, 扁平化, 再去算位移著實簡單得多.
... <看更多>