從C 中的函數傳回數組
嘗試從C 中的函數傳回數組可能會導致意外的行為,如以下程式碼所示snippet:
<code class="cpp">int* uni(int *a,int *b) { int c[10]; ... return c; }</code>
此函數嘗試從函數傳回本機陣列c。但是,當函數返回時,數組佔用的記憶體將被釋放,從而導致呼叫者嘗試存取它時出現未定義的行為。
根本問題在於陣列在堆疊上的儲存方式。當在函數內宣告數組時,它會在堆疊上分配,這是一個用於局部變數和函數呼叫的記憶體區域。當函數退出時,堆疊上的記憶體將被釋放,包括數組的記憶體。
要解決此問題,有幾種替代方法:
傳遞指標:
一種方法是從主函數將指標傳遞給陣列:
<code class="cpp">int* uni(int *a,int *b) { ... return a; }</code>
這種方法允許主函數直接存取和操作數組。但是,它需要仔細的記憶體管理以避免分段錯誤。
使用向量或陣列:
不要使用普通數組,而是考慮使用像 std::vector 這樣的 C 容器或 std::array。這些容器會自動處理記憶體管理,無需手動操作指標。
傳回結構:
另一個選項是將陣列包裝在結構中並傳回結構體實例:
<code class="cpp">struct myArray { int array[10]; }; myArray uni(int *a,int *b) { ... return c; }</code>
透過傳回一個值(結構體實例),數組的內容被複製到主函數的作用域中,確保它們的可存取性。
以上是如何從 C 函數安全地傳回數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!