malloc的替代品



在阅读K&R(第6.5节,第二版)时,我遇到了以下函数:

struct tnode *talloc(void)
{
    return (struct tnode *) malloc( sizeof(struct tnode) );
}

函数分配一些空间来存储struct tnode。我只是想通过问我是否能达到同样的效果来检查我的理解:

struct tnode *talloc(void)
{
    struct tnode s;
    return &s;
}

答案是否定的

struct tnode *talloc(void)
{
    return (strcut tnode *) malloc( sizeof(strcut tnode) );
}

malloc分配的空间可以在以后使用,通常是在堆上分配的空间。使用malloc分配的空间需要在您不再需要它时手动释放—否则您将获得内存泄漏。该指针可在函数返回后使用。

在下面的例子中

strcut tnode *talloc(void)
{
    struct tnode s;
    return &s;
}

结构体在堆栈上分配,并在函数退出时自动释放。因此,你返回的指针变成了一个悬空指针,你不能(在函数外)使用它。

当代码调用malloc时,系统给出一个指向内存区域的指针,系统承诺在该指针传递给freerealloc之前不将用于任何其他目的。在第二个示例中,声明保留了一个足够大的存储区域来容纳struct tnode,并保证在执行离开块(*)之前不会重用该存储区域。一旦执行离开块,用于保存struct tnode的存储空间将有资格被重用用于其他目的

(*)在对程序行为没有可观察到的影响的情况下,实现可能会将存储用于其他目的,但程序员通常不需要担心这一点。

相关内容

  • 没有找到相关文章

最新更新