[C]如何在自定义的calloc函数中实现清零操作?

garyHost 2011-08-23 07:13:16
大家好,

calloc函数与malloc函数的一个区别是:calloc会将动态分配的内存空间清零。

我作为练习,自行实现一个calloc函数,具体代码如下:


/*
**number_elements: 元素的个数;
**element_size : 元素所占字节数;
*/
void *my_calloc( size_t num_elements, size_t element_size )
{
if ( 0 == num_elements || 0 == element_size )
return ( NULL );

void *ptr = malloc( num_elements * element_size );

if ( NULL == ptr )
return ( NULL );

char *ptr_mover = (char *)ptr;
//void *ptr_mover = ptr; //由于这里是void *,不知道每次指针移动的字节数,如何清零?
for ( size_t i = 0; i < num_elements * element_size / sizeof (char); i++ )
*ptr_mover++ = 0;

return ( ptr );
}


我遇到的问题是函数中注释掉的那个语句,void *指针无法知道移动的字节数,所以如何执行清零操作呢?我这里使用的是char,但是不知道是否char在所有的环境下是否均是占1个字节,所以很可能会存在移植性的问题。

希望各位高人不惜赐教,谢谢啦。:)
...全文
222 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
低头思蚊香 2011-08-23
  • 打赏
  • 举报
回复
用宏可以提高移植性,如:
#define BYTE char
用的时候就用
BYTE *ptr_mover = (BYTE *)ptr;
还有return ( ptr );
返回的是一个char*而不是void *
garyHost 2011-08-23
  • 打赏
  • 举报
回复
谢谢两位。

把这个都忘了,看来还是不熟悉啊。
TitanQuest 2011-08-23
  • 打赏
  • 举报
回复
memset
icemornings 2011-08-23
  • 打赏
  • 举报
回复
memset(ptr, 0, num_elements * element_size);
-----------
C语言好像有规定sizeof(char)必须等于1,至于这个1是1Byte还是多少,我就不懂了……大多时候都是1Byte吧。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧