中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++小知識:C/C++中不要按值傳遞數組

發布時間:2020-10-15 02:55:31 來源:腳本之家 閱讀:153 作者:修語講編程 欄目:編程語言

錯誤的代碼:

ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
 memcpy( mat, src, sizeof( src ) );
}

說明:

有時候程序員會忘記 C/C++ 里數組不能按值傳遞給函數。當你試圖這樣做時,是數組的指針(第一個元素的地址)而不是整個數組被傳遞。我們還應該記住,方括號中的數字沒有任何意義。它們僅僅是程序員所做的標志,記錄了傳遞數組的『假定』大小。事實上,你也可以傳遞一個大小完全不同的數組。例如,下面的代碼就會成功編譯:

void F(int p[10]) { }
void G()
{
 int p[3];
 F(p);
}

相應的,sizeof(src) 運算符表示的不是數組的大小,而是指針的大小。結果就是memcpy() 僅復制了數組的一部分。也就是4或8字節,這取決于指針的大小(外部結構體不算)。

正確的代碼:

這樣的代碼最簡單的變形像這樣:

ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) {
 memcpy(mat, src, sizeof(float) * 3 * 3);
}

建議:

有幾種讓你的代碼更安全的方法。

數組大小已知。你可以在函數中使用數組的引用。但并不是每個人都知道可以這么做,知道如何編寫這樣的代碼的人則更少。所以我希望這個例子是有趣并有用的:

ID_INLINE mat3_t::mat3_t( float (&src)[3][3] )
{
 memcpy( mat, src, sizeof( src ) );
}

現在就可以給函數傳遞大小正確的數組了,而且最重要的是,sizeof() 得到了數組的實際大小。

解決這個問題的另一個方法是使用std::array類。

數組大小未知。一些書的作者建議使用std::vector類,或者其他相似的類。然而實際中這樣做并不總是很方便。

有時你想用一個簡單的指針。在這種情況下,你應該向函數傳遞兩個參數:一個指針和元素的數量。然而,總的來說這不是一個好做法,它會導致很多bug。

這種情況下,可以去讀一下《C++核心指南》中的一些想法。我建議看《不要用一個單獨的指針傳遞數組》章節。總而言之在你有空時讀讀《C++核心指南》總是有好處的。里面有很多有用的想法。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南昌县| 丹寨县| 昆明市| 黑龙江省| 新郑市| 克山县| 岐山县| 宣恩县| 井陉县| 英德市| 莎车县| 新郑市| 荃湾区| 哈尔滨市| 林芝县| 科尔| 和林格尔县| 额济纳旗| 永康市| 缙云县| 信丰县| 禹城市| 富锦市| 峡江县| 迁西县| 视频| 竹北市| 防城港市| 呈贡县| 英德市| 赣榆县| 南宫市| 涪陵区| 敦化市| 庐江县| 大新县| 乌苏市| 宣城市| 师宗县| 油尖旺区| 丽水市|