C++小知識:C/C++中不要按值傳遞數(shù)組
錯誤的代碼:
ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { memcpy( mat, src, sizeof( src ) ); }
說明:
有時候程序員會忘記 C/C++ 里數(shù)組不能按值傳遞給函數(shù)。當(dāng)你試圖這樣做時,是數(shù)組的指針(第一個元素的地址)而不是整個數(shù)組被傳遞。我們還應(yīng)該記住,方括號中的數(shù)字沒有任何意義。它們僅僅是程序員所做的標(biāo)志,記錄了傳遞數(shù)組的『假定』大小。事實上,你也可以傳遞一個大小完全不同的數(shù)組。例如,下面的代碼就會成功編譯:
void F(int p[10]) { } void G() { int p[3]; F(p); }
相應(yīng)的,sizeof(src)
運算符表示的不是數(shù)組的大小,而是指針的大小。結(jié)果就是memcpy()
僅復(fù)制了數(shù)組的一部分。也就是4或8字節(jié),這取決于指針的大?。ㄍ獠拷Y(jié)構(gòu)體不算)。
正確的代碼:
這樣的代碼最簡單的變形像這樣:
ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { memcpy(mat, src, sizeof(float) * 3 * 3); }
建議:
有幾種讓你的代碼更安全的方法。
數(shù)組大小已知。你可以在函數(shù)中使用數(shù)組的引用。但并不是每個人都知道可以這么做,知道如何編寫這樣的代碼的人則更少。所以我希望這個例子是有趣并有用的:
ID_INLINE mat3_t::mat3_t( float (&src)[3][3] ) { memcpy( mat, src, sizeof( src ) ); }
現(xiàn)在就可以給函數(shù)傳遞大小正確的數(shù)組了,而且最重要的是,sizeof()
得到了數(shù)組的實際大小。
解決這個問題的另一個方法是使用std::array
類。
數(shù)組大小未知。一些書的作者建議使用std::vector
類,或者其他相似的類。然而實際中這樣做并不總是很方便。
有時你想用一個簡單的指針。在這種情況下,你應(yīng)該向函數(shù)傳遞兩個參數(shù):一個指針和元素的數(shù)量。然而,總的來說這不是一個好做法,它會導(dǎo)致很多bug。
這種情況下,可以去讀一下《C++核心指南》中的一些想法。我建議看《不要用一個單獨的指針傳遞數(shù)組》章節(jié)??偠灾谀阌锌諘r讀讀《C++核心指南》總是有好處的。里面有很多有用的想法。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
C/C++ 運用Npcap發(fā)送UDP數(shù)據(jù)包的完美過程
UDP 是一種無連接、輕量級的傳輸層協(xié)議,與 TCP 相比,它不提供可靠性、流控制和錯誤恢復(fù)機制,但卻更加簡單且具有較低的開銷,這篇文章主要介紹了C/C++ 運用Npcap發(fā)送UDP數(shù)據(jù)包,需要的朋友可以參考下2023-11-11C++強制類型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_ca
本文主要介紹了C++強制類型轉(zhuǎn)換,主要介紹了static_cast、dynamic_cast、const_cast、reinterpret_cast的4種方法,感興趣的可以了解一下2021-08-08C語言?struct結(jié)構(gòu)體超詳細(xì)講解
C語言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04C語言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實現(xiàn)并分析
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實現(xiàn)并分析的相關(guān)資料,需要的朋友可以參考下2017-03-03