1.malloc
-
原型:
void* malloc(size_t size);
(位于<stdlib.h>
頭文件中) -
作用:分配一塊連續的、未初始化的內存塊,大小為
size
字節。 -
返回值:
- 成功:返回指向分配內存首地址的
void*
指針(需強制類型轉換后才能使用)。 - 失敗(如內存不足):返回
NULL
。
- 成功:返回指向分配內存首地址的
-
代碼示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p; // 1. 聲明一個 char 類型的指針 pp=(char *)malloc(1); // 2. 動態分配 1 字節的內存,并將地址賦給 p*p= 'c'; // 3. 將字符 'c' 存儲到 p 指向的內存中printf("%c\n",*p);p=(char *)malloc(12);strcpy(p,"Hello!");printf("%s",p);return 0;
}
- 成果展示:
2.realloc
作用:調整動態內存塊大小(擴大/縮小)。
原型:
void *realloc(void *ptr, size_t new_size);
ptr
:原內存指針。new_size
:新大小(字節)。若為0
且ptr
非空,等同free
。
關鍵點:
- 可能移動內存:若原位置空間不足,會分配新內存并復制數據。
示例:
int *arr = malloc(5 * sizeof(int));
arr = realloc(arr, 10 * sizeof(int)); // 擴容到10個int
free(arr);
- 代碼示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{char *p; p=(char *)malloc(7);strcpy(p,"Hello!");printf("%s\n",p);printf("擴容前地址:%p\n",p);free(p); p=NULL;int len;len=strlen("若原位置空間不足,會分配新內存并復制數據");p=realloc(p,len+1);strcpy(p,"若原位置空間不足,會分配新內存并復制數據");printf("%s\n",p);printf("擴容后地址:%p\n",p);return 0;
}
- 成果展示:
3.free
作用:釋放 malloc
/calloc
/realloc
分配的動態內存,防止內存泄漏。
用法:
void free(void *ptr); // ptr 必須是動態分配的內存地址
關鍵點:
- 必須配對使用:每個
malloc
都要對應一個free
。 - 避免懸空指針:釋放后指針應置
NULL
(ptr = NULL
)。 - 禁止重復釋放:對同一內存多次
free
會導致崩潰。 - 僅用于動態內存:靜態數組(如
int a[10]
)不可free
。
示例:
int *p = malloc(10 * sizeof(int));
if (p != NULL) { // 使用內存... free(p); p = NULL; // 安全操作
}
4.memset
功能
快速將某塊內存的所有字節設為指定值(按字節填充)。
函數原型
void *memset(void *ptr, int value, size_t num);
ptr
:目標內存首地址(如數組、結構體)。value
:填充值(實際取低8位,范圍0~255)。num
:填充的字節數(通常用sizeof
計算)。- 返回值:返回
ptr
本身。
常用場景
-
清零內存(最安全):
int arr[10]; memset(arr, 0, sizeof(arr)); // 所有字節置0
- 代碼示例:
#include <stdio.h>
#include <string.h>int main()
{int arr[10]={1,2,3,4,};memset(arr,0,sizeof(arr));for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
- 成果展示:
-
填充字符數組:
char str[10]; memset(str, 'A', 5); // 前5字節設為'A'(需手動補'\0')
- 代碼示例:
#include <stdio.h>
#include <string.h>int main()
{char arr[10];memset(arr,'S',5);for(int i=0;i<10;i++){printf("%c ",arr[i]);}return 0;
}
- 成果展示: