C語言基礎(chǔ)之動態(tài)內(nèi)存操作匯總
共 4212字,需瀏覽 9分鐘
·
2024-04-18 22:45
來源:機(jī)器之心
1、堆區(qū)空間申請
#include <stdlib.h> //頭文件
void *malloc(size_t size);//函數(shù)
size表示申請的空間字節(jié)數(shù)
函數(shù)的返回值:
成功:返回值空間起始地址
失?。?span style="border-width: 0px;border-style: initial;border-color: initial;color: rgb(138, 115, 4);">NULL
特點(diǎn):
分配指定大小的內(nèi)存空間;
分配的內(nèi)存空間是連續(xù)的;
需要手動釋放內(nèi)存;
malloc和free是配對使用的;
malloc和free不會自動初始化內(nèi)存內(nèi)容
注意:
malloc函數(shù)返回的指針類型為void*,這意味著它是一個通用指針類型。在使用malloc函數(shù)返回的指針時,需要將其強(qiáng)制轉(zhuǎn)換為所需的指針類型。
示例1:為字符串申請空間
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
//空間申請
char *str = "asdasd";
char *pb = NULL;
pb = (char *)malloc(sizeof(str));
if(pb == NULL)
{
return;
}
pb = str;
printf("*pb = %s\n",pb);
//釋放空間
free(pb);
return 0;
}
示例2:為數(shù)值申請空間
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
//空間申請
int *pb = NULL;
pb = (int *)malloc(sizeof(int));
if(pb == NULL)
{
return;
}
*pb = 10;
printf("*pb = %d\n",*pb);
//釋放空間
free(pb);
return 0;
}
2、堆區(qū)空間釋放
#include <stdlib.h>
void free(void *ptr);
ptr需要釋放的堆區(qū)空間的起始地址
3、memset函數(shù)
#include <string.h> //頭文件
void *memset(void *s, int c, size_t n);//函數(shù)
s 就是空間的起始地址
c 空間中每個字節(jié) 填充的值,通常為0
n 就是空間的字節(jié)寬度
memset函數(shù)會將內(nèi)存區(qū)域s中的前n個字節(jié)設(shè)置為字符值c。這個函數(shù)通常用于初始化內(nèi)存區(qū)域或清空內(nèi)存區(qū)域。
案例1:
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char str[10];
memset(str, 'A', 5); // 將str的前5個字節(jié)設(shè)置為'A'
printf("%s\n", str); // 輸出"AAAAA"
return 0;
}
案例2:
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int *pb = NULL;
pb = (int *)malloc(sizeof(int));
if(pb == NULL)
{
return;
}
memset(pb,0,n*sizeof(int)); //將堆區(qū)空間清0
*pb = 10;
printf("*pb = %d\n",*pb);
//釋放空間
free(pb);
return 0;
}
4、calloc函數(shù)
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
nmemb:內(nèi)存的塊數(shù)
size:每一塊的字節(jié)數(shù)
返回值:成功為堆區(qū)空間起始地址 失敗為NULL
calloc會對申請的空間 自動清0
示例:
#include <stdio.h>
#include <stdlib.h>
void Input(int *p, int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", p + i);
}
}
void Output(int *p, int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", p[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int n = 0;
printf("請輸入int元素的個數(shù):");
scanf("%d", &n);
//根據(jù)元素個數(shù) 申請空間
int *p = NULL;
p = (int *)calloc(n, sizeof(int));
if (p == NULL)
{
return;
}
//鍵盤獲取輸入
Input(p,n);
//遍歷
Output(p,n);
//釋放空間
free(p);
return 0;
}
5、realloc函數(shù)(追加空間)
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
ptr:指向要重新分配的內(nèi)存區(qū)域的指針。
newSize:新的內(nèi)存區(qū)域大?。ㄒ宰止?jié)為單位)。
如果成功,它會返回一個指向新的內(nèi)存區(qū)域的指針。如果失敗,它會返回NULL。
示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(5 * sizeof(int)); // 分配5個整數(shù)的內(nèi)存空間
if (arr == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
// 使用realloc重新分配內(nèi)存空間,將大小改為10個整數(shù)
arr = (int *)realloc(arr, 10 * sizeof(int));
if (arr == NULL) {
printf("Memory reallocation failed.\n");
return 1;
}
// 在新分配的內(nèi)存空間中存儲一些值
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
// 輸出數(shù)組中的值
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // 釋放動態(tài)分配的內(nèi)存空間
return 0;
}
6、內(nèi)存的泄露
程序無法正確釋放不再使用的內(nèi)存時。內(nèi)存泄漏會導(dǎo)致程序消耗越來越多的內(nèi)存,直到耗盡所有可用內(nèi)存,導(dǎo)致程序崩潰或運(yùn)行緩慢。
內(nèi)存泄漏通常發(fā)生在以下情況:
動態(tài)分配的內(nèi)存未釋放;
局部變量未釋放;
結(jié)構(gòu)體或數(shù)組未釋放;
為了檢測和避免內(nèi)存泄漏,可以使用一些工具和技術(shù),例如:
使用靜態(tài)代碼分析工具:這些工具可以檢查代碼中的潛在錯誤,包括內(nèi)存泄漏。
使用動態(tài)分析工具:這些工具可以在程序運(yùn)行時檢測內(nèi)存泄漏。例如,Valgrind是一種流行的動態(tài)分析工具,可以檢測C語言程序中的內(nèi)存泄漏。
編寫代碼時注意內(nèi)存管理:在編寫代碼時,應(yīng)該注意何時分配和釋放內(nèi)存。確保在使用完動態(tài)分配的內(nèi)存后及時釋放它們,并避免使用指向局部變量的指針。
使用智能指針:智能指針是一種自動管理內(nèi)存的機(jī)制,可以在適當(dāng)?shù)臅r候自動釋放內(nèi)存,從而避免內(nèi)存泄漏。在C++中,可以使用智能指針來管理動態(tài)分配的內(nèi)存。
7、總結(jié)
空間的申請
malloc(size_t size);//空間申請
calloc(size_t nmemb, size_t size);//空間塊申請
空間的使用
memset(void *s, int c, size_t n);//空間初始化
calloc(size_t nmemb, size_t size);//空間追加
空間的釋放
free(void *ptr);//空間釋放
春招已經(jīng)開始啦,大家如果不做好充足準(zhǔn)備的話,春招很難找到好工作。
送大家一份就業(yè)大禮包,大家可以突擊一下春招,找個好工作!
