既然有動態配置記憶體,那麼有靜態配置的記憶體嗎?
當然有喔!
在 C++ 中,什麼時候會用到靜態配置記憶體,我只能說是大多時候喔!
// 靜態記憶體範例
int n = 5;
int arr[] = {1, 2, 3, 6, 4};
那麼他有什麼特色呢?
#include <iostream>
int main() {
int arrLength;
std::cin >> arrLength;
int arr[arrLength];
}
我們說編譯器會在編譯結束時,完成靜態記憶體的配置,但是上述的程式碼的行為是「執行程式碼時,我們才知道陣列長度」,那麼這個結果又會是如何呢?
執行小程式時,不會出問題,因為系統給定的記憶體超過你所需要的記憶體量。但是當你要求的記憶體過於龐大,就有機會出現錯誤!
那要怎麼處理呢?使用動態配置記憶體!
#include <iostream>
int *add(int x, int y) {
int result = x + y;
return &result;
}
int main() {
int a = 1, b = 2;
std::cout << *add(a, b) << std::endl;
}
編譯上述的程式碼雖然可能不會給你錯誤訊息(ERROR),但是你一定會收到如下的警告訊息(WARNING)
warning: address of stack memory associated with local variable 'result' returned [-Wreturn-stack-address] return &result;
因為你使用了區域變數作為回傳值,且儲存這個變數的記憶體準備要被系統清除了!你有機會因為失去這塊記憶體的存取權而得到 Segmentation Fault。
那要怎麼改善呢?使用動態配置記憶體!
下一篇,就來正式介紹動態配置記憶體吧!並解決上述的兩個問題。