当前位置: 首页 > 知识库问答 >
问题:

释放()初始化内存为0[重复]

邹玄裳
2023-03-14
int main() 
{   
    int *p,*q;  
    p=(int *)malloc(sizeof(int));   
    *p=5;   
    free(p);
} 

当我在执行free(p)语句后检查分配给p的内存地址时,我发现内存内容为0。因为我读到free没有将内存初始化为0,所以这是正确的行为吗?

共有1个答案

高迪
2023-03-14

free(p)返回*p的内容未定义。它可能是0,42或其他任何东西。

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    int *p, *x;

    p = malloc(sizeof(int));
    *p = 5;

    // the following will print "0x7fd0cac00350: 5" or similar
    printf("%p: ", p);
    printf("%d\n", *p);

    free(p);

    printf("%p\n", p); // won't change from before
    printf("%d\n", *p); // UNDEFINED BEHAVIOR
}
 类似资料:
  • 我在C#上度过了一段糟糕的时光,在我不再引用它之后,没有为我保存在内存中的大型结构释放内存。 我在下面包含了一些代码,它们显示了与我遇到的问题类似的问题。我想我一定是误解了GC,因为我不确定为什么下面的代码会抛出内存不足异常。 有人知道为什么我包含的代码会丢失内存吗?没有一份名单被保留,可以立即清理。 谢谢, 保罗 复制:全新的4.5控制台应用程序,将代码粘贴到Main中。 异常将在for循环的第

  • 如果我写 而不是 或者与之相反 第一个在任何方面都不安全吗?

  • 问题内容: 我应该在将分配的字符串传递给之后释放它吗? 我有一些类似的代码: 在将字符串传递给之后释放字符串时,出现错误。如果我删除呼叫,该错误消失。我究竟做错了什么? 我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。 问题答案: 参数to 的存储完全由您负责:如果您分配了,则需要它。因此,您发布的代码段是正确的。您正在其

  • 问题内容: 这些陈述有何不同? 双虚拟= 0; 双虚拟= 0.0; 双虚拟= 0.0d; 双虚拟= 0.0D; 问题答案: 尝试过一个简单的程序(使用0和100来显示“特殊”常数和通用常数之间的差异)之后,Sun Java 6编译器将为1和2输出相同的字节码(情况3和4与2相同)就编译器而言)。 因此,例如: 编译为: 但是,我在Java语言规范中看不到任何能 保证 常量表达式的编译时扩展的东西。

  • 问题内容: 平台之间可能有所不同,但是 当我使用gcc编译并运行下面的代码时,每次在ubuntu 11.10中获得0。 为什么即使有calloc,malloc的行为也是如此? 难道就意味着即使您不希望有时将值初始化为0,也会有不必要的性能开销吗? 编辑:哦,我以前的示例不是初始化,而是碰巧使用“新鲜”块。 我恰恰在寻找的是为什么它在分配一个大块时将其初始化: 但是,感谢您指出进行分配时存在安全原因