通过清除内存违规来中止而不是段错误

2023-12-08

我在处理 C 字符串时遇到了这种奇怪的行为。这是 K&R 书中的一个练习,我应该编写一个函数,将一个字符串附加到另一个字符串的末尾。这显然要求目标字符串分配足够的内存,以便源字符串适合。这是代码:

 /* strcat: Copies contents of source at the end of dest */
 char *strcat(char *dest, const char* source) {
  char *d = dest;
  // Move to the end of dest
  while (*dest != '\0') {
    dest++;
  } // *dest is now '\0'

  while (*source != '\0') {
    *dest++ = *source++;
  }
  *dest = '\0';
  return d;
}

在测试过程中,我编写了以下内容,预计程序运行时会发生段错误:

int main() {
  char s1[] = "hello";
  char s2[] = "eheheheheheh"; 
  printf("%s\n", strcat(s1, s2));
}

据我了解 s1 得到一个 6 的数组chars分配并 s2 为 13 的数组chars。我以为当strcat尝试在索引高于 6 处写入 s1 时,程序会出现段错误。相反,一切工作正常,但程序并没有干净地退出,而是:

helloeheheheheheh
zsh: abort      ./a.out

并以代码 134 退出,我认为这只是意味着中止。

为什么我没有出现段错误(或者如果字符串分配在堆栈上,则覆盖 s2)?这些字符串在内存中的哪里(堆栈或堆)?

感谢您的帮助。


我认为当 strcat 尝试写入时s1指数高于6程序会出现段错误。

在堆栈上分配的内存范围之外写入是未定义的行为。调用这种未定义的行为通常(但并非总是)会导致段错误。然而,你不能sure会发生段错误。

维基百科链接解释得很好:

当发生未定义行为的实例时,就语言规范而言,任何事情都可能发生,也许什么也不会发生。

因此,在这种情况下,您可能会遇到段错误,程序可能会中止,或者有时它可能会正常运行。或者,任何东西。没有办法保证结果。

这些字符串在内存中的哪里(堆栈或堆)?

既然你已经将它们声明为char [] inside main(),它们是具有自动存储,出于实际目的,这意味着它们在堆栈上。

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

通过清除内存违规来中止而不是段错误 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 有没有一种简单的方法来准备 Fortran 代码以进行并行调用

    我想使用 OpenMP 在 C 程序中并行求解多个大型 ODE 系统 由于某些原因 我需要使用 ODE 求解器 但我只能找到 Fortran 90 子例程 而且代码太大 无法简单地将其转换为 C 我知道 Fortran 广泛使用静态内存 因
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • OPENCV waitKey()方法返回类型

    我正在尝试使用在线教程学习 OPENCV 用于图像处理项目 opencv 文档说 waitKey 返回一个 int 这应该是按下的键的 ASCII 值 但大多数在线教程都使用以下代码 可以正常编译和运行 if char 27 waitKey
  • Python XML 解析和 getElementsByTagName

    我试图解析以下 xml 并围绕我的业务需求获取我感兴趣的特定标签 我想我做错了什么 不知道如何解析我所需的标签 想要利用 pandas 以便我可以进一步过滤细节 学弟学妹们多多支持 我的 XML 来自 URI
  • Clojure core.logic CLP(FD) 投影 FD 变量

    我正在使用 Clojure 的 core logic CLP FD 库 core logic 版本 0 8 3 开发一种简单的方形打包算法 正方形表示如下 x11 y11 x12 y12 x21 y21 x22 y22 每个正方形表示为其左
  • 如何防止 scanf() 永远等待输入字符?

    我想在控制台应用程序中完成以下任务 如果用户输入一个字符 应用程序将执行以下操作 相应的任务 例如 如果用户输入1 该程序 如果用户输入 将执行任务 1q 程序将退出 如果用户没有输入任何内容 程序将每隔10秒执行一次默认任务 时间不必很严
  • 从 Excel VBA 关闭 Word 应用程序

    我试图在宏开始时关闭所有打开的 Word 应用程序实例 尽管我不知道哪些文档已打开 并且无法将它们设置为对象 这将关闭所有正在运行的 Word 文档 你需要On Error Resume Next以防止在没有运行 Word 应用程序实例时出
  • 如何从webview中获取html内容?

    从 webview 获取 html 代码的最简单方法是什么 我尝试了stackoverflow和google的几种方法 但找不到确切的方法 请说一下具体的方法 public class htmldecoder extends Activit
  • 构造函数中的依赖注入容器

    为什么将容器放在构造函数中这么糟糕 例如 您想要在另一个类 C 的构造函数中解析类 B 因为您需要将类 B 与解析的依赖项一起使用 您开始按照您希望的方式使用类 C 就像使用 B 一样 但使用依赖关系已解决 为什么将容器放在构造函数中这么糟
  • 从嵌入的 Google 表格中删除 Google 边框

    我希望将 Google 表格嵌入到 Google 扩展程序中 足够简单 只需使用自动生成的嵌入代码并将其粘贴到 html 文件中即可 这就是我所做的
  • iOS otool 检测私有 api [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我是第一次 ios 开发人员 找不到任何有关私有 ap
  • 为什么在 JavaScript 中“Object instanceof Function”和“Function instanceof Object”都返回 true?

    为什么在 JavaScript 中同时执行这两项操作Object instanceof Function and Function instanceof Object return true 我在 Safari WebInspector 中
  • 詹金斯在失败的阶段继续管道

    我有一个带有一堆管道的詹金斯设置 我编写了一个新的管道 可以立即启动所有管道 我想建造其他阶段 即使其中一个阶段失败了 目前的脚本看起来像这样 stage CentOS6 build centos6 testing stage CentOS
  • Nokogiri 可以解释 javascript 吗? - 网页抓取

    我们正在尝试抓取此页面上的可用性 http www equityapartments com new york new york city apartments midtown west mantena apartments aspx 我需
  • 增加 FD_SETSIZE 的限制并选择

    我想增加我的系统的 FD SETSIZE 宏值 有没有办法增加 FD SETSIZE 这样 select 就不会失败 按照标准 没有办法增加FD SETSIZE 一些程序和库 例如 libevent 尝试通过为fd set对象并传递大于的值
  • MongoDB 基于每个元素对多个文档中的数组求和

    我有以下文档结构 针对此示例进行了简化 id ObjectId sdfsdf result 1 3 5 7 9 id ObjectId asdref result 2 4 6 8 10 我想得到这些的总和result数组 但不是总和 而是一
  • RubyMine 的运行配置导致 Ubuntu 上出现“Yarn 需要 Node.js 4.0”错误

    在我的 Elementary OS 机器 基于 Ubuntu 的操作系统 上 使用以下命令创建新的 Ruby on Rails 项目后rails new yarntest并将其加载到 RubyMine 中 我无法使用 RubyMine 的
  • 静态全局和本地标识符的隐藏

    以下程序是在课堂上分发的练习工作表上的 我们被要求提供它的输出 但根据我对链接的理解 file2 c 不应该有两个静态标识符 b 的实例 但程序编译时会出现警告并运行得很好 我的问题是 为什么允许这样做 我认为静态链接的要点是能够访问该文件
  • JMeter JSR 223 语言 js 与 javascript

    关于 JSR 223 采样器语言 我可以选择 javascript ECMAScript ECMA 262 第 51 版 Oracle Nashorn 1 8 0 144 and Node js ECMAScript ECMA 262 版本
  • ios - 混合 MIDI 文件,每个文件都有自己的声音字体

    我正在寻找一种方法来混合 2 个或更多 MIDI 文件 每个文件都有自己的声音字体文件 我找到了一个文件的以下代码 并尝试做多个音乐播放器 但我想这不应该是正确的方法 而且我每秒都会听到一些奇怪的流行声音 那么有没有其他方法 也许没有音乐播
  • 如何唯一化元组元素?

    我有一个字典结果元组 result name xxx score 120L name xxx score 100L name yyy score 10L 我想将其统一 统一操作后result name xxx score 120L name
  • 通过清除内存违规来中止而不是段错误

    我在处理 C 字符串时遇到了这种奇怪的行为 这是 K R 书中的一个练习 我应该编写一个函数 将一个字符串附加到另一个字符串的末尾 这显然要求目标字符串分配足够的内存 以便源字符串适合 这是代码 strcat Copies contents