gpt4 book ai didi

c - 为什么在释放指向它的指针后我仍然可以访问结构的成员?

转载 作者:太空狗 更新时间:2023-10-29 17:05:44 25 4
gpt4 key购买 nike

如果我定义一个结构...

struct LinkNode
{
int node_val;
struct LinkNode *next_node;
};

然后创建一个指向它的指针...

struct LinkNode *mynode = malloc(sizeof(struct LinkNode));

...然后最后 free() 它...

free(mynode);

...我仍然可以访问结构的“next_node”成员。

mynode->next_node

我的问题是:底层机制的哪一部分跟踪了这个内存块应该表示结构 LinkNode 的事实?我是 C 的新手,我预计在我对指向我的 LinkNode 的指针使用 free() 之后,我将无法再访问该结构的成员。我期待某种“不再可用”的警告。

我很想知道更多关于底层流程如何运作的信息。

最佳答案

编译后的程序不再了解struct LinkedNode 或名为next_node 的字段,或类似的任何内容。编译后的程序中完全没有任何名称。编译后的程序以数值形式进行操作,可以起到内存地址、偏移量、索引等作用。

在您的示例中,当您读取程序源代码中的 mynode->next_node 时,它会被编译成机器代码,该机器代码仅从某个保留的内存位置读取 4 字节数值(在您的源代码中称为变量 mynode),将 4 添加到它(这是 next_node 字段的偏移量)并读取结果地址处的 4 字节值(它是 mynode->next_node)。如您所见,此代码根据整数值(地址、大小和偏移量)进行操作。它不关心任何名称,例如 LinkedNodenext_node。它不关心内存是否被分配和/或释放。它不关心这些访问中的任何一个是否合法。

(我在上面的例子中反复使用的常量 4 是 32 位平台特有的。在 64 位平台上,在大多数(或所有)实例中它会被 8 代替。)

如果尝试读取已释放的内存,这些访问可能会使您的程序崩溃。或者他们可能不会。这纯粹是运气问题。就语言而言,行为是未定义的。

关于c - 为什么在释放指向它的指针后我仍然可以访问结构的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16467545/

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