C替代malloc

时间:2016-10-09 15:35:16

标签: c pointers struct 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;
}

2 个答案:

答案 0 :(得分:9)

答案是否定的。

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

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

在以下示例中

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

结构在stack上分配,并在函数退出时自动释放。因此,您返回的指针变为悬挂指针,您无法使用(在函数外部)。使用范围之外的范围对象是undefined behavior

答案 1 :(得分:1)

当代码调用malloc时,系统会给出一个指向内存区域的指针,系统承诺不会将用于任何其他目的,直到该指针传递给{{1} }或free。在第二个示例中,声明保留一个足够大的存储区域以容纳realloc,并保证在执行离开块(*)之前不会重用存储。执行离开块后,用于保存struct tnode的存储将有资格再次用于其他目的

(*)如果这样做对程序行为没有可观察到的影响,实现可能会将存储用于其他目的,但程序员通常不应该担心这一点。