2.76-库函数calloc有如下声明:

该博客介绍了如何编写一个安全的calloc实现,通过调用malloc进行内存分配,并利用memset将内存初始化为0。博客中提供了示例代码,检查了算术溢出并确保在不同大小的size_t表示下都能正常工作。示例代码通过了测试,包括当nmemb或size为0的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接题目:

void *calloc(size_t nmemb, size_t size);

根据库文档:“函数calloc为一个数组分配内存,该数组有nmemb 个元素,每个元素为size字节。内存设置为0。如果nmemb或size为0,则calloc返回NULL。"
编写calloc的实现,通过调用malloc执行分配,调用memset将内存设置为0。你的代码应该没有任何由算术溢出引起的漏洞,且无论数据类型size_ t用多少位表示,代码都应该正常工作。
作为参考,函数malloc和memset声明如下:

void *malloc(size_t size);
void *memset(void *s ,int c ,size_t n);

开始作答 官方答案(已验证)

#include <stdio.h>
#include <assert.h>
#include <stdlib.h> 
#include <stdint.h> 
#include <string.h>

/* rename to avoid conflict */ 
void* another_calloc(size_t nmemb, size_t size) { 
	if (nmemb == 0 || size == 0) {
		return NULL;
	}
	size_t buf_size = nmemb * size;
	/* a good way to check overflow or not */ 
	if (nmemb == buf_size / size) {
		void* ptr = malloc(buf_size);
		if (ptr != NULL) { 
			memset(ptr, 0, buf_size); 
		}
		return ptr; 
	}
	return NULL; 
}
int main(int argc, char* argv[]) {
	void* p; 
	p = another_calloc(0x1234, 1);
	assert(p != NULL); free(p);
	p = another_calloc(SIZE_MAX, 2); 
	assert(p == NULL); 
	free(p); 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榆钱不知秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值