不要理解CII书中的功能List_list,第108页

时间:2014-05-27 21:00:33

标签: c

typedef struct T *T;
struct T {
    T rest;
    void *first;
}

T List_list(void *x, ...) {
    va_list ap;
    T list, *p = &list;
    va_start(ap, x);

    for ( ; x; x = va_arg(ap, void *)) {
        NEW(*p);
        (*p)->first = x;
        p = &(*p)->rest;
    }
    *p = NULL;
    va_end(ap);
    return list;
}

我对这个功能有几个问题。

  • 为什么在for循环中分配new *p*p被分配&list,如果新内存分配给*p*p是否还有列表地址?
  • p = &(*p)->rest是什么意思? *p&list&(*p)列表指针的地址是p = *(&(*p))->rest吗?如果是,那应该是#define NEW(p) ((p) = ALLOC((long)sizeof *(p))) #define ALLOC(nbytes) Mem_alloc((nbytes), __FILE__, __LINE__) void *Mem_alloc(long nbytes, const char *file, int line){ void *ptr; assert(nbytes > 0); ptr = malloc(nbytes); if (ptr == NULL) ¢raise Mem_Failed 742 return ptr; } 吗?

以下是NEW

的定义
{{1}}

1 个答案:

答案 0 :(得分:0)

第一行typedef struct T *T;T定义为指向struct T的指针,因此T *p是指向struct T的指针。

  • NEW(*p)是一个新的列表项,每个参数分配一个
  • p = &(*p)->rest正在将“插入位置”p移动到下一个位置。在此行p指向列表中最后一项的rest指针后。它也可以写成p = &((*p)->rest)来澄清优先顺序。