需要動態開闢內存的場景有以下幾種:

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

查看內存情況:

C++進階學習(七)  動態開闢內存的應用場景_函數調用

因為我們輸入的是int類型數據,佔四個字節,所以在內存上 7、8、9是連續的,每個地址通常代表一個字節的內存位置,只是高位都是0。

C++進階學習(七)  動態開闢內存的應用場景_i++_02

當輸入 4000000000 的時候對應的16進制數是 0xEE6B2800,這時候可以看到int 所佔的字節,高位即是相應的值,更直觀地説明了內存的連續性。