我正在努力学习艰难的书,并在练习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;
Room *arena = NEW(Room, "The arena, with the minotaur");
之后的代码中一样,您可以直接执行此操作arena->bad_guy = NEW(Monster, "The evil minotaur");
计算机如何知道有bad_guy
?? Object *el = calloc(1, size);
和*el = proto;
)之后,* el的内容究竟是什么?任何帮助将不胜感激!!
答案 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参数中。因此,所有函数都知道以字节为单位的大小。