c动态内存分配小记

动态分配内存

1.malloc函数

void *malloc(size_t size);

函数参数是要分配的内存数,返回一个指向被分配的内存块起始位置的指针,分配的是一块连续的内存。若无足够的内存,返回NULL指针。
2.free函数

void free( void *pointer);

函数的参数为malloc、calloc、realloc返回值或NULL。
释放整块动态内存的一部分是不允许的。
3.calloc函数

void *calloc(size_t num_elements, size_t element_size);

作用同malloc,参数为元素数量和大小,返回指向内存指针之前把它初始化为0。
4.realloc函数

void realloc(void *ptr, size_t new_size);

函数用于修改一个原先已经分配的内存块的大小。
扩大内存块,原先内容将会保存,新内容加到后面;缩小内存,内存块尾部将会被拿掉;无法改变大小,将原先的内容复制到新内存块上,所以要改用函数返回的新指针。
5.分配内存

int *pi;

pi = malloc( 100 );
/*pi为int类型占4个字节,pi就为25整型元素的数组*/
pi = malloc( 25 * sizeof(int));
/*得到能够存储25个整数的内存
 数组可使用指针或下标进行初始化
*/

6.检查错误的内存分配器实现
alloc.h

#include <stdio.h>

#define malloc
/*防止其他代码块直接塞入程序导致的偶尔直接调用malloc行为*/
#define MALLOC(num,type)   (type *)alloc( (num) * sizeof(type) )
/*参数为元素数目和元素类型,返回总的内存数目*/
extern void* alloc(size_t size);

alloc.c

#include <stdio.h>
#include "alloc.h"

#undef malloc
/*调用malloc不出错*/

void* alloc(size_t size)
{
	void* new_mem;
	new_mem = malloc(size);
	if (new_mem == NULL) {
		printf("out of memery!");
		exit(1);
	}
	return new_mem;
}

void function()
{
	int* new_memory;

	new_memory = MALLOC(25, int);
}

7.内存分配实例

#include <stdio.h>
#include <stdlib.h>

int compare_integers(void const* a, void const* b)
{
	register int const* pa = a;
	register int const* pb = b;

	return *pa > *pb ? 1 : *pa < *pb ? -1 : 0;
}

int main()
{
	int* array;
	int n_value;
	int i;

	printf("how many values are there?");
	if (scanf("%d", &n_value) != 1 || n_value <= 0) {
		printf("illegal number of value.\n");
		exit( EXIT_FAILURE);
	}

	array = malloc(n_value * sizeof(int));
	if (array == NULL)
	{
		printf("can't get memory for that many values. \n");
		exit(EXIT_FAILURE);
	}

	for (i = 0; i < n_value; i += 1)
	{
		printf("? ");
		if (scanf("%d", array + 1) != 1) {
			printf("Error reading value #%d\n", i);
			free(array);
			exit(EXIT_FAILURE);
		}
	}

	qsort(array, n_value, sizeof(int), compare_integers);

	for (i = 0; i < n_value; i += 1)
	{
		printf("%d\n", array[i]);
	}

	free(array);
	return EXIT_SUCCESS;
}

8.小结
动态分配内存允许程序为一个长度在运行时才知道的数组分配内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值