廣州白云會議中心分析鄭州官網(wǎng)網(wǎng)站優(yōu)化公司
一.動態(tài)內(nèi)存介紹🍗
在C語言中,動態(tài)內(nèi)存分配是指在程序運行時根據(jù)需要動態(tài)申請內(nèi)存空間,以便在程序的不同階段存儲和使用數(shù)據(jù)。動態(tài)內(nèi)存的分配與釋放需要一組函數(shù)來實現(xiàn),包括malloc、calloc、realloc和free。
malloc: 函數(shù)用于分配指定大小的內(nèi)存塊,并返回指向該內(nèi)存塊起始地址的指針。語法為:void *malloc(size_t size);
calloc: 函數(shù)用于分配指定數(shù)量和大小的內(nèi)存塊,并將內(nèi)存塊中的每個字節(jié)初始化為0。語法為:void *calloc(size_t num, size_t size);
realloc: 函數(shù)用于重新分配已經(jīng)分配的內(nèi)存塊的大小,可以增大或減小內(nèi)存塊的大小。語法為:void *realloc(void *ptr, size_t size);
free: 函數(shù)用于釋放通過malloc、calloc或realloc函數(shù)分配的內(nèi)存塊,以便將其歸還給系統(tǒng)。語法為:void free(void *ptr);
動態(tài)內(nèi)存分配區(qū)域:堆(heap),很大接近可用內(nèi)存,內(nèi)存申請和銷毀需要程序自行管理?內(nèi)存什么情況還給系統(tǒng): 1.程序(進程)退出 2.關(guān)機(重啟)?局部變量:定義在函數(shù)內(nèi)部的變量,包括形參,在棧(stack)中,作用域在函數(shù)內(nèi)部有效,生存周期:進入函數(shù) 創(chuàng)建,退出函數(shù)銷毀void :沒有,可以修飾返回值或參數(shù)列表 void *:通用指針,僅僅只標(biāo)記地址,不包含類型信息?應(yīng)用場景:?1.需要根據(jù)變量作為長度定義數(shù)組?2.函數(shù)結(jié)束后還需要繼續(xù)使用的內(nèi)存(例如返回局部數(shù)組的地址,鏈表)3.長度較大的數(shù)組(大內(nèi)存,超過棧1M的大小)
二.malloc函數(shù)的用法🍗
1.需要根據(jù)變量作為長度定義數(shù)組

2.函數(shù)結(jié)束后還需要繼續(xù)使用的內(nèi)存(例如返回局部數(shù)組的地址,鏈表)
正確的寫法
3.長度較大的數(shù)組(大內(nèi)存,超過棧1M的大小)
二.calloc函數(shù)的用法🍗
calloc會把動態(tài)申請的內(nèi)存每個單元初始化為0.
三.free崩潰的原因🍗
1.越界2.移動指針?3.重復(fù)釋放或者釋放非動態(tài)內(nèi)存
#include<stdio.h>
#include<stdlib.h>
//1.越界
int main()
{int n = 10;int* arr = (int*)malloc(n);assert(arr != NULL);for (int i = 0; i < n; i++)arr[i] = i;for (int i = 0; i < n; i++)printf("%d ", arr[i]);printf("\n");free(arr);return 0;
}//2.移動指針
int main()
{int n = 10;int* arr = (int*)malloc(n * sizeof(int));assert(arr != NULL);for (int i = 0; i < n; i++){//arr[i] = i;*arr = i;arr++;}printf("\n");free(arr);return 0;
}//重復(fù)釋放同一段內(nèi)存
int main()
{int n = 10;int* arr = (int*)malloc(n * sizeof(int));assert(arr != NULL);for (int i = 0; i < n; i++){arr[i] = i;}printf("%p\n", arr);free(arr);printf("%p\n", arr);//arr是野指針free(NULL);//可以//free(arr);//崩潰,重復(fù)釋放return 0;
}
如果對您有幫助的話,給小編一個免費的贊以表鼓勵吧🍗