c - 不明白CII书第108页中的函数List_list

标签 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)是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/

相关文章:

c - 指向结构本身的指针

iOS int类型默认值问题

c - C语言中ls命令的实现

c - 1[d=b] 是什么意思?

c - 在标识符后拆分 C 字符串

c - 下一个回文 SPOJ

c - 为什么 POSIX 要求 CHAR_BIT==8?

c - 数据结构、指针

c - LLVM 内存依赖性分析中的 Read after Read 依赖性

c - ANSI C 和 WinAPI : how to get a handle to the window from hook procedure?