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;
}
我对这个功能有几个问题。
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}}
答案 0 :(得分:0)
第一行typedef struct T *T;
将T
定义为指向struct T
的指针,因此T *p
是指向struct T
的指针。
NEW(*p)
是一个新的列表项,每个参数分配一个p = &(*p)->rest
正在将“插入位置”p
移动到下一个位置。在此行p
指向列表中最后一项的rest
指针后。它也可以写成p = &((*p)->rest)
来澄清优先顺序。