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