如何初始化块的字节,使它们包含全0

时间:2009-12-13 02:30:22

标签: c

我在内存管理任务中编写calloc函数(我正在使用C)。我有一个问题,我写了malloc函数并考虑将其用于calloc,因为它说callocnumsize并返回一个块我可以使用(num * size)来创建malloc的内存,但是,它说我需要将所有字节初始化为0 ,我对如何做到这一点很困惑一般来说? 如果您需要更多信息,请问我:)

因此malloc将向可用内存的第一个返回一个指针(Void指针),我必须遍历字节,将它们初始化为零,并将指针返回到可用内存的前端。

4 个答案:

答案 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."的代码。

这是你需要知道的。

  1. 为了一次处理一个字节的块,您需要将指针强制转换为引用字节的类型(char会很好)。要将指针转换为(例如)int指针,您可以使用int *block2 = (int*)block;

  2. 一旦有了正确类型的指针,就可以使用它来根据类型存储正确的数据值。你可以通过在循环中存储所需的值来实现这一点,该循环使指针递增并递减计数直到计数达到零。

  3. 希望这足以从解决方案的每个细节都没有泄露出来。如果你仍然有问题,请留下评论,我会充实答案,直到你把它弄好(因为它的功课,我会试图让你做大部分的思考)。

    更新:由于答案已被接受,我将发布完整的解决方案。仅用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 *转换为您可以取消引用/分配给的某种指针类型。