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
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,申请内存可以使用两个主要的函数:`malloc()` 和 `calloc()`。 `malloc()` 函数用于申请指定字节大小的内存空间,返回一个指向该内存空间的指针。它的函数原型为: ```c void* malloc(size_t size); ``` 其中 `size` 参数表示需要申请内存空间大小(以字节为单位)。例如,如果需要申请一个大小为 100 字节的内存空间,可以这样写: ```c int* ptr = (int*) malloc(100); ``` 上述代码中,`malloc()` 函数返回一个 `void*` 类型的指针,需要进行类型转换才能得到 `int*` 类型的指针。如果申请成功,`ptr` 指向一个大小为 100 字节的连续内存空间。 `calloc()` 函数也用于申请内存空间,与 `malloc()` 不同的是,它会在申请内存空间的同时将该内存空间中的所有位都初始化为 0。`calloc()` 函数的函数原型为: ```c void* calloc(size_t num, size_t size); ``` 其中 `num` 参数表示需要申请内存块数,`size` 参数表示每个内存块的大小(以字节为单位)。例如,如果需要申请 10 个大小为 4 字节的内存块,可以这样写: ```c int* ptr = (int*) calloc(10, sizeof(int)); ``` 上述代码中,`calloc()` 函数返回一个指向大小为 `10 * sizeof(int)` 字节的内存空间的指针,其中每个 4 字节大小的内存块都被初始化为 0。 无论是使用 `malloc()` 还是 `calloc()`,在使用完申请内存空间后,需要使用 `free()` 函数将其释放,以便操作系统回收该内存空间。例如,释放上述申请内存空间,可以这样写: ```c free(ptr); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值