C语言 - 申请内存
                
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;
                    