c - 我调用 free(),但指针仍然有数据并且其内容没有改变

标签 c free

代码如下。

我的问题是关于结果的。我想明白,为什么在调用 free(p) 之后 p->elem 变成 '0',但 p->str 仍然包含“hello”?

#define LEN (sizeof(struct node))
typedef struct node
{
       int elem;
       char *str;

}*p_node;
int main(void)
{
    p_node p;
    p=(p_node)malloc(LEN);
    p->elem=99;
    p->str="hello";
    printf("the p->elem:%d\n",p->elem);
    printf("the p->str :%s\n",p->str);
    free(p);
    printf("the p->elem:%d\n",p->elem);
    printf("the p->str :%s\n",p->str);
    return 0;
}

http://i.stack.imgur.com/rt1jf.png

最佳答案

释放内存实际上并不会清除指针或其指向的内存(除非在特殊情况下旨在帮助调试此类问题 - 但永远不要依赖该行为)。释放指针所指向的内存后使用指针是无效的,并且是未定义的行为。它也可能会崩溃,或者导致打印随机值。

另外,在 C 语言中你应该 not cast the return of malloc .

关于c - 我调用 free(),但指针仍然有数据并且其内容没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801582/

相关文章:

c++ - 打开简历;如何释放 IplImage*?

c - tANI_U32 数据类型是什么意思?

c - C 中的内存管理问题

c - [strcat&malloc&free],当我使用 strcat() 时,指针似乎不是 NULL,即使我故意将其设为 NULL(没有额外赋值)?

正确的二维数组内存分配/解除分配?

c - 使用 malloc() 和 free() 的程序崩溃

c++ - 如何跳转到 C/C++ 函数声明而不是其定义?

c - 如何找到给定数字的最大数字

c - 带有新参数的宏

c++ - 如何在不破坏死键支持的情况下使用 ToUnicode?