C循环双向链表,静态头初始化next/prev指向静态头地址的指针

C Circular Doubly Linked List with static head initialization of next/prev pointers to static head address

我想初始化循环双向链表 next/previous 指针以指向用作 sentinel/first 元素的静态分配元素的地址。这样,我可以简化列表操作。我尝试了以下代码:

struct ErrorDataElement {
    struct ErrorDataElement *next;
    struct ErrorDataElement *prev;
    
    enum ErrorType type;
    int code;
    char **messages;
    char *file;
    char *function;
    int line;
} _errorList = { &_errorList, &_errorList, 0, -1, NULL, NULL, NULL, 0 };

当我打印 &_errorList 内存地址时(在从 main() 函数调用的子函数中),我得到了与 _errorList.next_errorList.prev 不同的地址。

_errorList.next_errorList.prev 具有一致的相同值。

如果我使用以下代码检查:

printf("%d %d", _errorList.code, _errorList.next->code);

我看到 _errorList.code = -1 符合预期,而 _errorList.next->code = 1001 向我表明 _errorList.next 的值已初始化为某个不正确的内存地址。 我怀疑这是由于 relative/absolute 函数初始化期间的内存寻址所致,但我无法弄清楚如何正确初始化静态元素,或者是否有可能进行此类初始化。

我无法重现您的问题。当我执行它时,它会打印出预期的结果:

void afunc(struct ErrorDataElement *elem) {
    printf("%p %p %p\n", elem, elem->next, elem->prev); 
    printf("%d %d %d\n", elem->code, elem->next->code, elem->prev->code); 
}

int main() {
    afunc(&_errorList); // prints ==> 0x601030 0x601030 0x601030
                        //            -1 -1 -1
    return 0;
}

如果我直接从main打印也一样,找不到你解释的情况。你不能显示你的确切代码吗?