在这个片段中,内存分配有帮助吗?我认为它被* tmpl覆盖了吗?

时间:2017-11-09 21:10:17

标签: c pointers

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。我假设分配内存的位置被覆盖了?请解释一下。

2 个答案:

答案 0 :(得分:0)

混淆来自声明指针Token *r = malloc(sizeof(Token));与取消引用指针(*r)的语法相匹配的语法。第一行实际上意味着它初始化指向Token r的指针,并且等同于Token* r,而第二行取消引用r所指向的空间修改它。因此,完整代码获取指向结构的指针,将结构复制到通过malloc创建的新内存中,并对其执行操作 - 指针r在赋值后不会更改,只有它指向的数据。

请注意,如果tmplNULL,则此代码的行为未定义。

答案 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本身不会被覆盖。