2009-12-13 29 views
3

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

所以malloc将返回一个指针(无效指针)的第一个可用内存,我必须通过字节,初始化为零,并返回指针到可用内存的前端。

+0

我没有做CS学位,我做过数学。在向人们介绍C之前,让他们在演示如何使用指针之前实现stdlib是正常的吗?似乎有点屁股给我。你不通过编写垃圾收集器来学习Java。 – 2009-12-13 13:13:52

+0

@Steve Jessop这可能不是C类。这可能是一个操作系统类或微控制器类或类似的东西。 – 2009-12-13 23:46:18

+0

啊,这样做更有意义。如果是这样,也许课程的先决条件应该是更强调;-) – 2009-12-15 00:55:56

回答

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; 
+0

其实你是对的我不允许使用memset,但是,我的问题是坐着记忆到0,我知道我必须循环它并设置每个字节使用字符为零(所以我可以移动一个字节的时间),但我不知道如何使用它将其设置为零... – user230515 2009-12-13 02:40:27

+0

只分配每个字节0. – 2009-12-13 02:42:16

+0

(无符号)char是一个整型,并且C标准保证对于这种类型的所有比特0表示0。这是什么让你感到困惑? – 2009-12-13 02:46:28

2

当您需要将一块内存设置为相同的值时,请使用memset函数。

它看起来像这样:void * memset (void * ptr, int value, size_t num);

您可以找到有关功能的更多信息:http://www.cplusplus.com/reference/clibrary/cstring/memset/

+0

如果我也需要自己写memset怎么办? (我现在正在查看链接对不起,如果链接提供此信息) – user230515 2009-12-13 02:36:26

0

提示:

  • 已经有调零的块的POSIX库函数内存

  • 考虑铸造void *某些指针类型th在你可以解除引用/分配给。

1

如果你不能使用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."的代码。

以下是您需要知道的信息。

  1. 为了在一次处理该块中的字节,则需要将指针转换为引用字节(char将是一件好事)一个类型。要将指针投射到(例如)int指针,您可以使用int *block2 = (int*)block;

  2. 一旦你有了正确的指针类型,就可以使用它来根据类型存储正确的数据值。您可以通过将所需的值存储在循环中来完成此操作,循环会递增指针并递减计数,直到计数达到零。

希望这足以开始而不会泄露解决方案的每个细节。如果你仍然有问题,留下评论,我会充实你的答案,直到你有它的正确(因为它是作业,我会努力让你做大部分的想法)。

更新:由于答案已被接受,我会发布我的完整解决方案。要在短短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指针。

+0

你必须在返回它之前说cblock =(void *)cblock,因为你需要返回一个void指针:)但是感谢代码:) – user230515 2009-12-13 07:05:09

+0

@ c2009l1:不,你不需要做那样的事情。强制转换为void *'在C中执行(在C++中,如wll,BTW)。另外,做'cblock =(void *)cblock'完全没有意义。你为什么要投它,然后分配给相同的变量? – AnT 2009-12-13 08:05:44

+0

@paxdiablo:我不知道你是否试图尽可能使它正确,但是'calloc'的正确实现也必须确保乘法'count * sz'不会溢出。 – AnT 2009-12-13 08:09:17