C 简单对象系统

C 简单对象系统,c,malloc,calloc,C,Malloc,Calloc,我正在努力学习《艰难之路》一书,在练习19中遇到了一些问题。作者说ex19是为了让学习者了解c语言中的宏。我在理解这个概念上没有问题,但我只是不理解其他的一切。我无法理解对象原型是如何创建的 特别是,下面这句话是什么意思 由于C将Room.proto字段放在第一位,这意味着el指针是 真的只有指向足够的内存块才能看到完整的 对象结构。它甚至不知道它叫proto 相关代码如下: // this seems weird, but we can make a struct of one size, /

我正在努力学习《艰难之路》一书,在练习19中遇到了一些问题。作者说ex19是为了让学习者了解c语言中的宏。我在理解这个概念上没有问题,但我只是不理解其他的一切。我无法理解对象原型是如何创建的

特别是,下面这句话是什么意思

由于C将Room.proto字段放在第一位,这意味着el指针是 真的只有指向足够的内存块才能看到完整的 对象结构。它甚至不知道它叫proto

相关代码如下:

// this seems weird, but we can make a struct of one size,
// then point a different pointer at it to "cast" it
Object *el = calloc(1, size);
*el = proto;
  • 谁能告诉我malloc/calloc到底是如何工作的?据我所知,它只是分配所需的内存数量并返回第一个地址。如果是这样,计算机如何知道分配内存的数据结构?就像在代码中一样,在
    Room*arena=NEW之后(Room,“竞技场,有牛头怪”),你可以直接做这个
    竞技场->坏家伙=新(怪物,“邪恶的牛头怪”)
    
  • 在上述两个语句(
    Object*el=calloc(1,size);
    *el=proto;
    )之后,*el的内容究竟是什么
  • 任何帮助都将不胜感激


    指向练习的链接:

    它所做的只是分配
    1*大小的字节。malloc/calloc没有什么神奇之处。他通过新宏将sizeof(T)传递给函数,并将其放入Object_NEW的size参数中。因此,函数只知道以字节为单位的大小。

    calloc
    还有一个附加功能,即它用零字节填充分配的内存,而如果最初需要全部或部分分配为零,则使用等效的
    malloc
    调用将需要额外的步骤

    在代码中

    arena->bad_guy = NEW(Monster, "The evil minotaur"); 
    
    编译器知道结构的布局,因为访问是通过arena变量进行的,arena变量被声明为指向Room的指针,Room可能是结构的
    typedef

    另一方面,结构中的顺序保证允许在复合结构或扩展结构中进行有限形式的继承

    struct A {
        int x;
    };
    
    struct B {
        int foo;
        double baloney;
    };
    
    struct B
    (或指向它的指针)可以强制转换为(指向a的指针)
    struct a
    ,因为它们都以
    int
    开头。当然,如果您以另一种方式强制转换,
    struct A
    必须最初是
    struct B
    ,否则对
    baloney
    字段的访问权限将未定义。换句话说,
    struct B
    基本上以
    struct a
    开始

    如果我像这样重写我的示例,这可能更容易理解:

    struct A {
        int x;
    };
    
    struct B {
        struct A foo;
        double baloney;
    };
    
    现在,您可以通过不同的方式从结构B中获取结构a

    struct A a;
    struct B b;
    
    a = b.foo;  // regular member variable access
    
    struct A *ap = &a;
    struct B *bp = &b;
    
    ap = (struct A *)bp;  // cast the pointer
    
    ap = & b.foo;         // take a pointer from the member variable
    ap = & bp->foo;       // take a pointer from the member variable via a pointer
    

    内存“malloc”ed的类型由分配返回值的指针类型暗示。malloc的大小由“malloc”例程存储在某个地方(通常在返回地址之前的内存中)。这就是“free”神奇地知道调用它时返回多少内存的方式。谢谢!我懂一点。。。但我只想知道什么是
    Object*el=calloc(1,size)指的是正常的操作方式是
    Object*el=calloc(1,sizeof(Object)),以及执行此操作后内存中发生了什么
    *el=proto由于el指向的大于proto需要的值。由于
    calloc
    用零字节填充内存,内存中的结果将是proto的值后跟零字节,直到
    大小。在我的示例中,
    struct A
    struct B
    的一个适当子集,因此
    struct B
    始终可以像使用
    struct A
    一样使用。它们包含相同的前缀,即
    int
    。基本上,
    struct B
    在开头包含一个
    struct a
    ,即使成员变量有不同的名称。多亏了快速回答!我想我明白了,真的谢谢!