從C 中的函數傳回陣列
嘗試從C 中的函數傳回陣列可能會導致意外行為,如以下程式碼所示片段:
int* uni(int *a,int *b)
{
int c[10];
...
return c;
}
此函數嘗試從函數傳回本機陣列 c。但是,當函數返回時,數組佔用的記憶體將被釋放,從而導致呼叫者嘗試存取它時出現未定義的行為。
根本問題在於陣列在堆疊上的儲存方式。當在函數內宣告數組時,它會在堆疊上分配,這是一個用於局部變數和函數呼叫的記憶體區域。當函數退出時,堆疊上的記憶體將被釋放,包括數組的記憶體。
要解決此問題,有幾種替代方法:
傳遞指標:
一種方法是從主函數傳遞指向陣列的指標:
int* uni(int *a,int *b)
{
...
return a;
}
這種方法允許主函數直接存取和操作陣列。但是,它需要仔細的記憶體管理以避免分段錯誤。
使用向量或數組:
不要使用普通數組,請考慮使用 C 容器,如 std::vector或 std::array。這些容器會自動處理記憶體管理,無需手動操作指標。
傳回結構體:
另一個選項是將陣列包裝在結構體中並傳回結構實例:
struct myArray
{
int array[10];
};
myArray uni(int *a,int *b)
{
...
return c;
}
透過傳回一個值(結構體實例),將陣列的內容複製到主函數的作用域中,確保它們的可存取性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3