C 有字符串类型吗? [关闭]

2024-01-23

我最近从 Java 和 Python 开始用 C 语言编程。现在,在我的书中,我注意到要制作“Hello World”程序,语法如下:

char message[10]
strcpy(message, "Hello, world!")
printf("%s\n", message);

现在,这个示例使用的是 char 数组,我想知道 - 字符串发生了什么?为什么我不能简单地使用其中之一?也许有不同的方法可以做到这一点?


C 没有也从来没有原生字符串类型。按照惯例,该语言使用数组char以空字符终止,即'\0'。语言标准库中的函数和宏提供对空终止字符数组的支持,例如,strlen http://pubs.opengroup.org/onlinepubs/009695399/functions/strlen.html迭代数组char直到遇到一个'\0'性格和strcpy http://pubs.opengroup.org/onlinepubs/009695399/functions/strcpy.html从源字符串中复制,直到遇到'\0'.

C 中以 null 结尾的字符串的使用反映了这样一个事实:C 的目的只是比汇编语言高级一点。当时已经直接支持零终止字符串PDP-10 和 PDP-11 的汇编语言 http://en.wikipedia.org/wiki/Null-terminated_string#History.

值得注意的是,C 字符串的这一属性会导致相当多令人讨厌的缓冲区溢出错误,包括严重的安全缺陷。例如,如果您忘记以 null 终止作为源参数传递给的字符串strcpy,该函数将继续从内存中的任何内容复制源字符串末尾之后的连续字节,直到它碰巧遇到0,可能会覆盖内存中目标字符串位置后面的任何有价值的信息。

在您的代码示例中,字符串文字“Hello, world!”将被编译成一个14字节长的数组char。前 13 个字节将包含字母、逗号、空格和感叹号,最后一个字节将包含空终止符'\0',由编译器自动为您添加。如果您要访问数组的最后一个元素,您会发现它等于0. E.g.:

const char foo[] = "Hello, world!";
assert(foo[12] == '!');
assert(foo[13] == '\0');

然而,在你的例子中,message仅 10 个字节长。strcpy将把所有 14 个字节(包括空终止符)写入从地址开始的内存中message。前 10 个字节将被写入堆栈上分配的内存中message剩余的四个字节将简单地写入堆栈的末尾。在这种情况下,将这四个额外字节写入堆栈的后果很难预测(在这个简单的示例中,它可能不会造成任何伤害),但在现实世界的代码中,它通常会导致数据损坏或内存访问冲突错误。

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

C 有字符串类型吗? [关闭] 的相关文章

随机推荐

  • 如何在 TypeScript 中从界面中排除某个键

    在 TypeScript 中 您可以像这样组合两种接口类型 interface Foo var1 string interface Bar var2 string type Combined Foo Bar 我不想组合键 而是想将键从一个接
  • Mercurial qfold 所有补丁?

    结果发现没有hg qfold a I tried hg qfold hg qunapp and hg qunapp xargs hg qfold但无法让它发挥作用 有任何想法吗 通过您的 xargs 方法 您是否还记得 qfold 只能折叠
  • 计算多维数组中的重复值

    我需要计算多维数组中的相同值并删除重复项 我的阵列 r a b a b c d c d c d e f 需要输出 0 gt Array 0 gt a 1 gt b 1 gt 2 Result 1 gt Array 0 gt c 1 gt d
  • 为什么允许访问另一个对象的私有字段?

    最近 我观察到在 Java 中访问 priavte 字段的意外行为 考虑以下示例 该示例说明了该行为 public class A private int i lt private field public A int i this i i
  • 如何创建指向同一文件的 Doxygen 链接

    我想编写一条 Doxygen 注释来命名出现注释的文件 我希望 Doxygen 为我提供文件名 而不是显式地编写文件名 因此 如果我更改文件的名称 或将某些内容移动到不同的文件中 我不需要更改名称的硬编码实例 举一个具体的例子 假设我要向
  • 网页模板,其中内容占据视口的整个高度(如果有 1 行减去页脚)

    我正在寻找一个基于 CSS 的网页模板 其中主要内容div当其内容只有几行时 占据视口的整个高度 减去页眉和页脚高度 页脚应该位于视口的底部 而不是内容的正下方 它更多地位于视口的中间 内容区域需要垂直扩展才能与页脚顶部连接 如果内容需要比
  • Python:看不到抛出的异常

    我正在运行单元测试 我意识到抛出了异常 然而 我只是不确定到底抛出了什么 from pt hil utilities PT HIL Interface Utils widgets import PathPicker import unitt
  • 检测Webview滚动是否到达末尾

    我想弄清楚最大滚动的立场是WebView可以达到 我已经尝试过了webView pageDown true 但结果被延迟了 我无法向下滚动 然后在用户面前向上滚动 并且此方法并非每次都有效 我也尝试过webView getContentHe
  • Python3,通过点击按钮从url下载文件

    我需要从这样的链接下载文件https freemidi org getter 13560 https freemidi org getter 13560 但我不能使用urllib request or requests库 因为它下载 htm
  • 无法使用 Xcode 10 在 Mojave 上安装brew

    我无法在我的 Mac 上安装任何 BREW 软件包 并出现以下错误信息 安装在我的 Mac 上 macOS 10 14 测试版 18A293u Xcode 9 3 9E145 Xcode 10 0 测试版 10L176w Type in b
  • 扩展WPF工具包RichTextBox垂直显示文本

    我正在尝试通过其 Text 属性将丰富内容 RTF 格式 绑定到富文本框 扩展 WPF Toolkit 如下所示
  • NodeJS 需要('..')?

    我一直在查看一些 NodeJS 示例 遇到以下情况 var module require var module require 我明白 require 的作用 但不明白这样写时它的作用是什么 有人可以向我解释一下吗 这是定义在https n
  • Javascript:如何获取函数内的父键?

    我有一些函数 存储在集合 数组中 并且希望获取密钥 函数名称 而不重新输入它 有没有什么捷径可以访问它 var functions collection function x function var name function x nam
  • IO Monad 在什么意义上是纯粹的?

    我已经将 IO monad 描述为 State monad 其中状态是 现实世界 这种 IO 方法的支持者认为 这使得 IO 操作变得纯粹 就像引用透明一样 这是为什么 从我的角度来看 IO monad 内部的代码似乎有很多可观察到的副作用
  • 更改嵌套转发器内下拉列表的选定值

    我尝试从 C 代码更改下拉列表选定的值
  • HTML 5中是不是不需要像HTML那样关闭标签呢?

    HTML 5中是不是不需要像HTML那样关闭标签呢 或者是 W3C 验证器中的错误 为什么此代码在 W3C 验证器中有效 p Some Text 如果它在 HTML5 中真的有效 我会感到惊讶 但是在 HTML5 中保持这种行为有效有什么好
  • 如何共享 Maven 原型?

    我创建了一个 Maven 原型 我想在我的公司内分享它 为此 我将其部署到我们的 Nexus 服务器上 并且可以从那里使用它 但这有点不方便 因为它似乎不在其他计算机上已知原型的目录中 解决方法是像这样使用它 mvn archetype g
  • 如何使用 firestore 运行地理“附近”查询?

    Firebase 中的新 Firestore 数据库本身支持基于位置的地理查询吗 即查找 10 英里内的帖子 或查找 50 个最近的帖子 我看到有一些现有的实时 firebase 数据库项目 例如 geofire 这些项目也可以适用于 fi
  • 将 JavaFX WebView 调整为文档正文所需的最小大小

    我正在为我的项目编写一个 JavaFX 自定义对话框 我需要一种变体但快速的模式来显示对话框内容 我了解controlsFX 实际上我正在使用它 但我想在 WebView 中显示内容 这样它会更可控 问题是关于 WebView 的大小我想找
  • C 有字符串类型吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近从 Java 和 Python