如果你不能使用memset
,那么你需要逐个设置每个字节。
既然你打电话从calloc
功能malloc
,我会假设它看起来是这样的:
void *calloc (size_t count, size_t sz) {
size_t realsz = count * sz;
void *block = malloc (realsz);
if (block != NULL) {
// Zero memory here.
}
return block;
}
,你只需要"// Zero memory here."
的代码。
以下是您需要知道的信息。
为了在一次处理该块中的字节,则需要将指针转换为引用字节(char
将是一件好事)一个类型。要将指针投射到(例如)int
指针,您可以使用int *block2 = (int*)block;
。
一旦你有了正确的指针类型,就可以使用它来根据类型存储正确的数据值。您可以通过将所需的值存储在循环中来完成此操作,循环会递增指针并递减计数,直到计数达到零。
希望这足以开始而不会泄露解决方案的每个细节。如果你仍然有问题,留下评论,我会充实你的答案,直到你有它的正确(因为它是作业,我会努力让你做大部分的想法)。
更新:由于答案已被接受,我会发布我的完整解决方案。要在短短malloc
方面编写基本calloc
:
void *calloc (size_t count, size_t sz) {
size_t realsz, i;
char *cblock;
// Get size to allocate (detect size_t overflow as well).
realsz = count * sz;
if (count != 0)
if (realsz/count != sz)
return NULL;
// Allocate the block.
cblock = malloc (realsz);
// Initialize all elements to zero (if allocation worked).
if (cblock != NULL) {
for (i = 0; i < realsz; i++)
cblock[i] = 0;
}
// Return allocated, cleared block.
return cblock;
}
注意,您可以直接与char
指针的函数中工作,因为他们可自由转换,并从void
指针。
我没有做CS学位,我做过数学。在向人们介绍C之前,让他们在演示如何使用指针之前实现stdlib是正常的吗?似乎有点屁股给我。你不通过编写垃圾收集器来学习Java。 – 2009-12-13 13:13:52
@Steve Jessop这可能不是C类。这可能是一个操作系统类或微控制器类或类似的东西。 – 2009-12-13 23:46:18
啊,这样做更有意义。如果是这样,也许课程的先决条件应该是更强调;-) – 2009-12-15 00:55:56