一个简单的对象系统

时间:2014-04-01 09:51:36

标签: c malloc calloc

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

Especilly,以下的意思是什么意思?

  

由于C首先放置Room.proto字段,这意味着el指针是   真的只是指着足够的内存块看到一个完整的   对象结构。它不知道它甚至被称为原型。

相关代码是这样的:

// 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;
  1. 谁能告诉我malloc / calloc究竟是如何工作的?据我所知,它只是分配所需的内存数量并返回第一个地址。如果是这样,计算机如何知道分配的内存的数据结构?就像在Room *arena = NEW(Room, "The arena, with the minotaur");之后的代码中一样,您可以直接执行此操作arena->bad_guy = NEW(Monster, "The evil minotaur");计算机如何知道有bad_guy ??
  2. 在上述两个陈述(Object *el = calloc(1, size);*el = proto;)之后,* el的内容究竟是什么?
  3. 任何帮助将不胜感激!!

    练习的链接:http://c.learncodethehardway.org/book/ex19.html

2 个答案:

答案 0 :(得分:4)

calloc具有以零字节填充分配的内存的附加功能,而如果所有或部分分配最初需要为零,则使用等效的malloc调用将需要额外的步骤。

在代码中

arena->bad_guy = NEW(Monster, "The evil minotaur"); 

编译器知道结构的布局,因为访问是通过竞技场变量进行的,竞技场变量被声明为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;
};

现在,您可以通过不同方式从struct A中获得struct B

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

答案 1 :(得分:0)

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