需要動態開闢內存的場景有以下幾種:
1. 大數據量的內存開闢
2. 變量的生命週期需要超過函數調用週期
3. 不確定需要多大內存空間,需要運行時開闢內存
示例:
int main() {
// 假設我們現在需要接收用户所輸入的數,然後進行排序
int num;
printf("請輸入數的個數:");
// 獲取用户輸入
scanf_s("%d", &num);
// 定義一個數組來存放用户的數據
// int* arr[num]: 靜態開闢,內存大小不能改變
int* arr = (int*)malloc(sizeof(int) * num); // 動態開闢,內存大小可以改變
// for 循環接收用户輸入的數據
int i = 0;
int print_num;
for (; i < num; i++)
{
printf("請輸入第 %d 個數:", i + 1);
scanf_s("%d", &print_num);
*(arr + i) = print_num;
printf("%d, %p\n", *(arr + i), arr + i);
}
// 排序 堆排序,快排序
// 輸出用户輸入的數據
printf("您輸入的數為:"); // 在VS中,此處打斷點調試,查看內存情況
for (i = 0; i < num; i++)
{
printf("%d ", *(arr + i));
}
// 最後要回收內存
free(arr);
return 0;
}
輸出:
請輸入數的個數:3
請輸入第 1 個數:9
9, 0000013A6E6EA4C0
請輸入第 2 個數:8
8, 0000013A6E6EA4C4
請輸入第 3 個數:7
7, 0000013A6E6EA4C8
查看內存情況:
因為我們輸入的是int類型數據,佔四個字節,所以在內存上 7、8、9是連續的,每個地址通常代表一個字節的內存位置,只是高位都是0。
當輸入 4000000000 的時候對應的16進制數是 0xEE6B2800,這時候可以看到int 所佔的字節,高位即是相應的值,更直觀地説明了內存的連續性。