簡體   English   中英

C 循環雙向鏈表,帶有指向靜態頭地址的下一個/上一個指針的靜態頭初始化

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

我想初始化一個循環雙向鏈表的 next/previous 指針以指向用作哨兵/第一個元素的靜態分配元素的地址。 這樣,我可以簡化列表操作。 我嘗試了以下代碼:

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的值已初始化為某些不正確的內存地址。 我懷疑這是由於函數初始化期間的相對/絕對內存尋址,但我無法確切地弄清楚以及如何正確初始化靜態元素,或者甚至是否可能進行這種初始化。

我無法重現您的問題。 當我執行此操作時,它會打印預期結果:

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 打印並且找不到您解釋的情況,情況也是如此。 你不能顯示你的確切代碼嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM