我在内存管理任务中编写calloc
函数(我正在使用C)。我有一个问题,我写了malloc
函数并考虑将其用于calloc
,因为它说calloc
将num
和size
并返回一个块我可以使用(num * size)
来创建malloc
的内存,但是,它说我需要将所有字节初始化为0 ,我对如何做到这一点很困惑一般来说?
如果您需要更多信息,请问我:)
因此malloc
将向可用内存的第一个返回一个指针(Void指针),我必须遍历字节,将它们初始化为零,并将指针返回到可用内存的前端。
答案 0 :(得分:4)
我假设你不能使用memset
,因为它是一个家庭作业任务分配,并处理内存管理。所以,我只是进入循环并将所有字节设置为0.伪代码:
for i = 1 to n:
data[i] = 0
哦,如果您无法理解如何取消引用void *
,请记住您可以这样做:
void *b;
/* now make b point to somewhere useful */
unsigned char *a = b;
答案 1 :(得分:2)
当您需要将内存块设置为相同的值时,请使用memset
函数。
看起来像这样:void * memset ( void * ptr, int value, size_t num );
您可以在http://www.cplusplus.com/reference/clibrary/cstring/memset/
找到有关该功能的更多信息答案 2 :(得分:1)
如果您无法使用memset
,则需要单独设置每个字节。
由于您从malloc
函数调用calloc
,我将假设它看起来像这样:
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;
。
一旦有了正确类型的指针,就可以使用它来根据类型存储正确的数据值。你可以通过在循环中存储所需的值来实现这一点,该循环使指针递增并递减计数直到计数达到零。
希望这足以从解决方案的每个细节都没有泄露出来。如果你仍然有问题,请留下评论,我会充实答案,直到你把它弄好(因为它的功课,我会试图让你你做大部分的思考)。
更新:由于答案已被接受,我将发布完整的解决方案。仅用calloc
:
malloc
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
指针。
答案 3 :(得分:0)
提示:
已经存在用于归零内存块的posix库函数
考虑将void *
转换为您可以取消引用/分配给的某种指针类型。