static Token *make_token(Token *tmpl) {
Token *r = malloc(sizeof(Token));
*r = *tmpl;
r->hideset = NULL;
File *f = current_file();
r->file = f;
r->line = pos.line;
r->column = pos.column;
r->count = f->ntok++;
return r;
}
他们将内存分配给* r。然后他们把它等同于* tmpl。我假设分配内存的位置被覆盖了?请解释一下。
答案 0 :(得分:0)
混淆来自声明指针Token *r = malloc(sizeof(Token));
与取消引用指针(*r
)的语法相匹配的语法。第一行实际上意味着它初始化指向Token
r
的指针,并且等同于Token* r
,而第二行取消引用r
所指向的空间修改它。因此,完整代码获取指向结构的指针,将结构复制到通过malloc
创建的新内存中,并对其执行操作 - 指针r
在赋值后不会更改,只有它指向的数据。
请注意,如果tmpl
为NULL
,则此代码的行为未定义。
答案 1 :(得分:0)
首次进入该功能时,您遇到以下情况:
+---+ +----------------+
tmpl: | | ----> | Token instance |
+---+ +----------------+
+---+
r: | | ----> ???
+---+
malloc
来电之后,您有:
+---+ +----------------+
tmpl: | | ----> | Token instance |
+---+ +----------------+
+---+ +-------------------------+
r: | | ----> | Heap memory from malloc |
+---+ +-------------------------+
*r = *tmpl;
语句将Token
指向的 tmpl
实例的内容复制到指向的堆内存 r
:
+---+ +----------------+
tmpl: | | ----> | Token instance |
+---+ +----------------+
| | | |
| | | |
V V V V
+---+ +-------------------------+
r: | | ----> | Heap memory from malloc |
+---+ +-------------------------+
r
本身不会被覆盖。