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;
上一篇:实现单链表


下一篇:2.22√ 对单链表进行就地逆置