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打印也一样,找不到你解释的情况。你不能显示你的确切代码吗?
我想初始化循环双向链表 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打印也一样,找不到你解释的情况。你不能显示你的确切代码吗?