我對 C 比較陌生,我正在學習指標。我試圖為陣列動態分配一些記憶體并發現了這個問題。
這是我的代碼,
#include <iostream>
int main(){
int n = 5;
int *arr = new int(n*(sizeof(int)));
for(int i=0; i<n; i )
*(arr i) = i 1;
delete[] arr;
for(int i=0; i<n; i )
std::cout << *(arr i) << " ";
}
并且預期的輸出是一些垃圾值,因為我正在使用 delete 運算子釋放記憶體,但是,這是我的輸出:
首輪:
755597344 47626 2043 4 5
第二次運行:
-1437908960 62859 2043 4 5
第三輪:
-902037472 965 2043 4 5
我已經嘗試了幾次運行,但只有前 3 個值發生了變化,而其他值似乎仍然存在,這可能是什么解釋?
uj5u.com熱心網友回復:
在一小段代碼中有多個錯誤和問題:
該運算式
new int(n*(sizeof(int)))
分配一個值int
并將其初始化為 valuen*(sizeof(int))
。int
如果要為需要使用的值陣列分配空間new[]
,如new int[n]
由于上述問題,您將超出分配的記憶體范圍,導致未定義的行為。
解決問題 1 后,您需要
new[]
與delete[]
操作員配對。不匹配的運算子也會導致未定義的行為。最后,一旦你洗掉了記憶體,你就不能再訪問它,任何取消參考指標的嘗試都會再次導致未定義的行為。
總而言之,該程式應如下所示:
#include <iostream>
#include <cstdlib>
int main()
{
constexpr std::size_t n = 5;
// Allocate memory
int* arr = new[n];
// Initialize the memory
for (std::size_t i = 0; i < n; i)
{
arr[i] = i 1;
}
// Display the memory
for (std::size_t i = 0; i < n; i)
{
std::cout << "arr[" << i << "] = " << arr[i] << '\n';
}
// Free the memory
delete[] arr;
}
完成上述所有操作后,有更好的方法來創建固定大小或動態大小的陣列。
如果您有一個固定大小的陣列,其大小在編譯時已知并且其大小在運行時永遠不會改變,請std::array
改用:
// Create and initialize array
std::array<int, 5> arr = {{ 1, 2, 3, 4, 5 }};
// Display array
for (int value : arr)
{
std::cout << value << '\n';
}
如果在編譯時不知道大小,或者在運行時需要更改大小,請std::vector
改用:
// Create a vector with five "zero-initialized" elements
std::vector<int> arr(5);
uj5u.com熱心網友回復:
new int(n*(sizeof(int)));
這僅分配單個 int 并將值設定為n*(sizeof(int))
。
如果你想要 int 陣列,你必須像下面那樣做。
int *arr = new int[n];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470464.html