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)
是list指针的地址吗?如果是这样,应该是p = *(&(*p))->rest
吗?
这是NEW的定义
#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;
}
最佳答案
第一行typedef struct T *T;
将T
定义为指向struct T
的指针,因此T *p
是一个指向struct T
的指针。
- a
NEW(*p)
是一个新的列表项,为每个参数分配一个 p = &(*p)->rest
正在将“插入位置”p
移动到下一个位置。此行之后,p
指向列表中最后一项的rest
指针。它也可以写成p = &((*p)->rest)
以阐明优先级。
关于c - 不明白CII书第108页中的函数List_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898847/