释放字符串后仍然可以打印它吗?

2023-11-26

我正在学习和测试 C 中的内存分配,我想测试如果free()叫做。

我预计可能存在分段错误或指针NULL当我运行下面的程序后。但是,我仍然可以成功打印输出中的字符串。我也尝试过免费str两次,然后输出 2 发生错误。

看起来之前分配的内存已经成功释放,但是内存上的数据没有清理干净。那是对的吗?如果是这样的话,程序什么时候会清理那些被释放的内存空间呢?如果数据被释放但没有清理干净,那安全吗?

以上任何问题的答案都会有帮助!谢谢!

Code

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

int main()
{
    printf("Hello, World!\n");
    char *str = (char *)malloc(24);
    char *str2 = "tutorialspoint";
    strcpy(str, str2);
    free(str);
    printf("[str] %s\n", str);
    return 0;
}

Output

Hello, World!
[str] tutorialspoint

Output 2

main(83218,0x7fff9d2aa3c0) malloc: *** error for object 0x7fb0b2d00000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

Edit

谢谢大家的有用回复。现在我明白 C 中有一些未定义的行为(UB),这帮助我理解了之前让我困惑的其他事情,例如写入超出分配范围的字符串(如下面的代码片段中的内容)。这导致 UB 根据wiki,但程序不会崩溃。

如果我错了,请随时纠正我!

char *str = (char *)malloc(0);
char *str2 = "tutorialspoint";
strcat(str, str2);
printf("[str] %s, [addr] %p\n", str, str);

你需要学习这个概念未定义的行为.

即使您在释放字符串后打印该字符串并且它“works“,这并不意味着它有效。这只是当该行为被认为是时可能发生的事情之一不明确的,在本例中就是这样。

另外,指针也不会NULL除非你这样做

free(ptr);
ptr = NULL;

and free(),不将所有字节设置为0 either.

The free()函数的作用正如它的名字所暗示的那样。它允许malloc()使用free()再次d块。指针指向的数据可能仍然没有改变,这就是为什么你仍然可以打印之前的内容的原因free()。但是绝对不能保证如果您在之后取消引用指针会发生什么free()或者数据是否仍然存在,或者是否被完全或部分覆盖。

如果您在执行完之后取消引用指针free()d它,有一件事你确实知道,行为是未定义的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

释放字符串后仍然可以打印它吗? 的相关文章

  • 具有可绑定属性的自定义视图未在 Xamarin.Forms SAP 上正确绑定

    我有一个复选框 应该触发按钮的 IsEnabled 事件 但不知何故 应该执行的命令永远不会正确绑定并因此执行 这是 CheckBox xaml cs 控件 中的可绑定属性 public static readonly BindablePr
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • 序列化和反序列化 Visual Studio 解决方案文件 - 或以编程方式编辑?

    我想以编程方式添加和删除项目 解决方案文件夹和其他项目 例如解决方案的资源文件 但我不确定最好的方法是什么 对于那些不知道的人 高度简化 解决方案文件 sln 通常如下所示 Microsoft Visual Studio Solution
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 将非算术类型作为参数传递给 cmath 函数是否有效?

    给定以下用户定义类型S具有转换功能double struct S operator double return 1 0 以及以下调用cmath http en cppreference com w cpp header cmath使用类型的
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat

随机推荐

  • 当方向改变时,将图像在同一位置旋转 90 度

    最终这样做了 支持多个方向的最简单方法 当应用程序处于横向模式时 如何加载自定义 NIB 效果棒极了 我在 Photoshop 中制作了一张图像 想将其用作 iPad 应用程序中信息屏幕的背景 该图像还包含文本和一些图标 图像周围有一个绿色
  • jinja2 嵌套变量

    我目前正在学习 jinja2 我不确定如何以正确的方式寻址变量 这是我在 yaml 中的变量 hosts app201 acme com eth0 ip 46 0 0 1 netmask 255 255 255 255 graphite a
  • 如何用javascript显示数据列表?

    嘿 我想在单击按钮时显示特定输入的数据列表 但我找不到如何操作 HTML
  • 切片集合的 Python 方式是什么?

    我有一些数据列表 例如 some data 1 2 4 1 6 23 3 56 6 2 3 5 6 32 2 12 5 3 2 我想获得具有固定长度的唯一值 我不关心我会得到哪个 并且我也希望它成为set 我知道我能做到set from s
  • 跨多个脚本定义公共变量?

    我有许多 Bash 和 Perl 脚本 它们在功能上不相关 但相关之处在于它们在同一项目中工作 它们在同一个项目中工作的事实意味着我通常在每个脚本的顶部指定相同的目录 相同的项目特定命令 相同的关键字 目前 这并没有让我感到困扰 但我知道将
  • LINQ 表达式返回属性值?

    我正在尝试创建一个通用函数来帮助我使用 LINQ to SQL 从本地列表中选择数千条记录 SQL Server 至少 2005 将查询限制为 2100 个参数 我想选择比这更多的记录 这是一个很好的用法示例 var some produc
  • WordPress 表单操作提交

    在 WordPress 中有一个自己定制的表单 action send form php 提交时 它总是转到send form php 但是这个 php 用于发送信息 我无法使用主题进行样式设置 有没有办法在发送信息并打印出来并在字段中显示
  • 如何使RequiredAttribute与枚举字段一起使用

    我最近意识到 requiredAttribute 不适用于枚举字段 假设我在表单上有两个名为 ddlOfficers 和 ddlApplicationTypes 的选择元素 这两个元素都是在 HtmlHelper 方法的帮助下呈现的 创建d
  • Swift:将参数传递给选择器

    使用 Swift 3 Xcode 8 2 1 Method func moveToNextTextField tag Int print tag 下面的行编译得很好 但是tag有一个未初始化的值 let selector selector
  • C# 中的 Windows 版本 [重复]

    这个问题在这里已经有答案了 我想知道 PC 的 Windows 版本 在 C Framework 3 5 中 我尝试过使用 操作系统 os 环境 OSVersion 版本 ver os Version 但结果是 平台 WIN32NT 版本6
  • 四元数旋转不起作用

    在适用于 Android 的 OpenGL ES 1 中 我有一个由 27 个较小的立方体组成的 Rubic 立方体 我想要旋转 导致特定的小立方体恰好位于视点前面 所以我需要两个向量 一个是从对象原点到特定立方体的向量 另一个是从原点到视
  • 如何对hmatrix进行自动微分?

    Sooooo 事实证明从假矩阵 to hmatrix事实证明数据类型并不平凡 序言供参考 LANGUAGE RankNTypes LANGUAGE ParallelListComp LANGUAGE ScopedTypeVariables
  • 如何在 PHP 中重写 register_argc_argv ?

    我正在使用共享主机 fasthostingdirect 并且出于某种原因 他们默认关闭此标志 这意味着我无法访问 PHP 命令行参数 除非我使用 n no php info 之后标记php exe 试过ini set register ar
  • 在 matplotlib 中使用 3D 数据生成热图

    我有一个函数returnValuesAtTime返回三个列表 x vals y vals and swe vals 所有三个列表的长度相同 并且每个元素swe vals对应于一个x value from x vals and a y val
  • 如何获取当前所有正在运行的任务

    我想获取在 android 中运行的所有任务 我在 ActivityManager 中找到了 getRunningTasks 但从 android 5 0 开始 getRunningTasks 可能不会提供所有任务 在我的情况下 它提供主屏
  • 重写 Javascript 中的等价比较

    是否可以重写 Javascript 中的等价比较 我得到的最接近的解决方案是定义 valueOf 函数并在对象前面加上加号来调用 valueOf 这有效 equal x y true 但这失败了 equal x y true why doe
  • clojure.java.jdbc/延迟查询大结果集

    我正在尝试从数据库读取数百万行并写入文本文件 这是我的问题的延续数据库转储到文本文件有副作用 我现在的问题似乎是在程序完成之前不会发生日志记录 我没有懒惰处理的另一个指标是 在程序完成之前根本不会写入文本文件 根据 IRC 提示 我的问题可
  • 如何在不破坏 Maven 发布插件的情况下传递 javac 多个命令行参数(其中一些包括冒号)?

    当我忘记在 a 中声明serialVersionUIDs 时 我想让我的 Maven 构建失败Serializable班级 和javac 这很容易 javac Xlint serial Werror Source java 直接将其转换为
  • 当您有行跨度时替换行颜色

    我有这个 HTML table class altRowTable 这工作正常 直到我有一些行包含rowspan 各行不一致 所以我有这样的东西 下面的 代表一个空格 不能真正在 SOF 中做表 ID name Number 1 joe 1
  • 释放字符串后仍然可以打印它吗?

    我正在学习和测试 C 中的内存分配 我想测试如果free 叫做 我预计可能存在分段错误或指针NULL当我运行下面的程序后 但是 我仍然可以成功打印输出中的字符串 我也尝试过免费str两次 然后输出 2 发生错误 看起来之前分配的内存已经成功