C语言 - 申请内存
1、void * malloc(size_t size)
//头文件
#include<malloc.h>
- 申请空间是来连续的堆空间
- 需要么memset初始化
- 使用完需要释放free
- 返回空间的首地址
代码:
typedef struct Node{
int data;
struct Node * next;
}LNode;
void main()
{
LNode * p = NULL;
p = (LNode *)malloc(sizeof(LNode));
if(NULL == p)
{
printf("malloc failed.\n");
return;
}
printf("p address is %#x\n", p);
free(p);
p = NULL;
}
运行结果
[root@localhost home]# gcc -o client ClientM.c
[root@localhost home]# ./client
p address is 0x7f7010
[root@localhost home]#
2、void * calloc(int num,size_t size);
//头文件
#include<malloc.h>
- num:元素数目,
- 不需要memset
- 申请到的是连续的堆空间,即申请num个大小为size的连续地址空间
- 需要释放
代码
typedef struct Node{
int data;
struct Node * next;
}LNode;
void main()
{
LNode * NodeArr = NULL;
NodeArr = (LNode *)calloc(10, sizeof(LNode));
if(NULL == NodeArr)
{
printf("calloc failed.\n");
return;
}
printf("NodeArr address is %d\n", NodeArr);
free(NodeArr);
NodeArr = NULL;
}
3、void * realloc(void * ptr, size_t new_size)
//头文件
#include<malloc.h>
- realloc函数用于修改一个原先已经分配的内存块的大小,可以使一块内存的扩大或缩小。
- 当起始空间的地址为空,即*ptr = NULL,则同malloc。
- 当ptr非空:若nuw_size <
size,即缩小ptr所指向的内存空间,该内存块尾部的部分内存被拿掉,剩余部分内存的原先内容依然保留; - 若nuw_size >
size,即扩大*ptr所指向的内存空间,如果原先的内存尾部有足够的扩大空间,则直接在原先的内存块尾部新增内存,如果原先的内存尾部空间不足,或原先的内存块无法改变大小,realloc将重新分配另一块nuw_size大小的内存,并把原先那块内存的内容复制到新的内存块上。因此,使用realloc后就应该改用realloc返回的新指针。
注意:再调用完realloc后就不能使用指向就内存的指针,而是用返回的新的指针。
代码:
#include<Windows.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
int main()
{
const int size = 2000;
int *p = (int *)malloc(20 * sizeof(int));
int *p1 = (int *)realloc(p, size*sizeof(int));
printf("%x\n", p);
printf("%x\n", p1);
system("pause");
return 0;