gpt4 book ai didi

c - 将指针设置为 NULL 是否意味着不引用先前的值?

转载 作者:太空宇宙 更新时间:2023-11-04 08:48:23 25 4
gpt4 key购买 nike

假设我有一个如下所示的函数:

void fun() {
struct bintree {
struct bintree * left;
struct bintree * right;
};

// build a perfectly balanced 7-node bintree
struct bintree * root = malloc(sizeof(struct bintree));

root->left = malloc(sizeof(struct bintree));
root->right = malloc(sizeof(struct bintree));

root->left->left = malloc(sizeof(struct bintree));
root->left->right = malloc(sizeof(struct bintree));

root->right->left = malloc(sizeof(struct bintree));
root->right->right = malloc(sizeof(struct bintree));

// create a stack pointer to the left subtree of root
struct bintree * RL = root->left;

// remove pointer to root node from stack
root = NULL;

// could it be possible to find pointers to root, root->right and
// its children on the stack/registers?
}

我的(幼稚的)假设是,如果我在 fun 返回之前搜索整个堆栈并注册到根节点、root->right 及其子节点(在堆上)的地址,我将一无所获。这是一个公平的假设吗?如果是这样,您能想到的任何架构都可以有异常(exception)吗?怎么会这样?

最佳答案

对于大多数平台和环境,您的假设是错误的。数据值可以保存在某些寄存器或堆栈单元中,即使它们不再来自那些寄存器或堆栈单元。编译器完全有责任根据使用的调用约定将正确的值放入寄存器和单元格中并遵守所需的功能,但不能保证更多。这就是为什么例如局部变量在函数入口处充满了垃圾:它们保留了一些以前的值,在某些工作完成后不会被清除。

有些任务需要数据清理(例如,在应用密码后删除密码内容),但这是使用显式编码的内存区域清理完成的。

如果您正在考虑具有垃圾收集功能的语言,那是另一个类似的故事。

关于c - 将指针设置为 NULL 是否意味着不引用先前的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20721464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com