为什么 gcc 允许使用大于数组的字符串文字初始化 char 数组?

2024-03-25

int main()
{
    char a[7] = "Network";
    return 0;
}

A 字符串字面量在 C 中是内部终止的空字符。因此,上面的代码应该给出编译错误,因为字符串文字的实际长度Network是 8 并且它不能放入char[7] array.

然而,gcc(即使-Wall)在 Ubuntu 上编译此代码没有任何错误或警告。 为什么 gcc 允许这样做而不将其标记为编译错误?

当 char 数组大小小于字符串文字时,gcc 仅给出警告(仍然没有错误!)。例如,它会警告:

char a[6] = "Network";

[有关的]视觉C++ 2012给出编译错误char a[7]:

1>d:\main.cpp(3): error C2117: 'a' : array bounds overflow
1> d:\main.cpp(3) : see declaration of 'a'

使用大于它的字符串文字初始化 char 数组在 C 中没问题,但在 C++ 中则错误。这解释了 gcc 和 VC++ 之间行为的差异。

如果用 VC++ 编译与 C 文件相同的文件,则不会出现错误。如果使用 g++ 将其编译为 C++ 文件,则会出现错误。

C 标准说:

字符类型的数组可以通过字符串来初始化 文字或 UTF-8 字符串文字,可以选择用大括号括起来。 字符串文字的连续字节(包括终止 null 如果有空间或数组大小未知,则为字符) 初始化数组的元素。

[...]

实施例8

声明

char s[] = "abc", t[3] = "abc";

定义“普通”字符数组对象s and t其元素已初始化 与字符串文字。 该声明与

char s[] = { 'a', 'b', 'c', '\0' },
     t[] = { 'a', 'b', 'c' };

(《条例》第 6.7.9 条C11标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,最终标准中的实际措辞可能有所不同。)

这意味着如果数组没有空间容纳终止字符,则删除终止字符是完全正确的。这可能是出乎意料的,但这正是该语言应该如何工作的,并且是一个(至少对我而言)众所周知的功能。

相反,C++ 标准说:

初始值设定项的数量不得多于数组元素的数量。

Example:

 char cv[4] = "asdf"; // error

格式不正确,因为没有空间用于隐含的尾随“\0”。

(C++ 2011 草案的 8.5.2n3242 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf.)

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

为什么 gcc 允许使用大于数组的字符串文字初始化 char 数组? 的相关文章

  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • PHP条件,如果当前页面,则链接突出显示[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个带
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • android ListView不会突出显示所选行

    在我的应用程序中 我从服务器检索用户的播放列表 并感受到ListView与数据 问题是 ListView不突出显示单击的行 为了防止愤怒的评论告诉我我不使用搜索 我尝试过以下方法 将我行中的按钮设置为不可聚焦 通过代码和 XML 设置 li
  • Java 本机接口 (JNI) 是否受 C++ ABI 兼容性问题影响?

    Java 本机接口 JNI 是否受 C ABI 兼容性问题影响 我正在开发一个 Java 应用程序 我想使用 Java 本机接口 JNI 来调用 C 库中的函数 我可以访问 C 库的代码 并且可以根据需要重建它 例如 我可以静态链接 C 运
  • 如何使用现有的 solr 核心数据创建 solr 核心?

    Solr 1 4 企业搜索服务器建议对核心副本进行大量更新 然后将其交换为主核心 我正在执行以下步骤 创建准备核心 执行索引更新 然后在准备核心上提交 优化 交换主核心和预备核心 卸载准备核心 我遇到的问题是 步骤 1 中创建的核心中没有任
  • Enlive 模板 – 添加到头部

    我的应用程序的某些页面将有自己的 js css 包含 所以我想知道如何使用 Enlive 将这些资源添加到 html 文档的头部部分 我发现 append 变压器 但没有不自动转义的 html append 或者什么是正确的方法来做到这一点
  • 污染全局命名空间

    我想这里的大多数 C 程序员都会同意污染全局命名空间是一个坏主意 但是有时这条规则可以被忽略吗 例如 我有一个需要在特定应用程序中使用的类型 我应该这样定义它 mytypes h typedef int MY TYPE foo cpp MY
  • 如何获取表示 Java 对象的序列化字节数?

    我将使用什么语法来获取表示字符串的字节数并将它们与表示字符串的字节数进行比较ArrayList例如 拿着那根绳子 我正在使用多代理代理系统通过消息发送对象 并且我想跟踪每条消息占用的空间 该方法不必非常准确 只要它与对象的实际大小成比例即可
  • 当jasper中未显示上述组件时,如何使用positionType将组件上拉?

    positionType Float 如果上面的组件拉伸 则组件上的组件会自行下拉 但如果上述组件缩小 不显示 则不会向上移动 以下是使用的版本
  • 如何在websphere中配置和使用jstl

    有谁知道如何在 websphere 中配置 jstl 我知道我们在 web xml 中使用了 taglib 指令 我在 websphere 5 1 2 中哪里可以找到 web xml 以及如何添加配置 你不需要修改web xml根本不 一些
  • jQuery 组合框/选择自动完成? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否存在用于替换选择 组合框的 jQuery 插件 我尝试了SexyCombo 它与我想要的非常接近 但
  • 2 个数组值之一颜色之一使 D3 条形图在值的相同索引处具有颜色

    我有 2 个数组 values 1 2 3 4 5 4 7 2 9 10 colors red red blue blue green green orange orange pink pink 我正在尝试构建一个 D3 条形图 其中每个条
  • .NET Windows 窗体应用程序自我更新的最佳方式是什么?

    我使用自行开发的系统 其中应用程序通过 Web 服务自行更新 然而 我似乎记得最初的 NET 销售宣传中有关组件自动更新是 NET 的内置功能的内容 让应用程序更新自身和 或其使用的程序集的最佳实践是什么 您可能想了解一下 Click On
  • 在 Cypress 中多次拦截相同的 API 调用

    是否可以使用cy intercept在同一个测试中多次拦截相同的 API 调用 我尝试了以下方法 cy intercept pathname url method POST as call1 some logic cy wait call1
  • 将 sfml 与 cmake 链接 (Windows MinGW)

    我好像无法链接SFML到我的可执行文件使用cmake CMakeLists txt cmake minimum required VERSION 3 0 0 project Tut3 set LIBS DIR Libraries add e
  • 使用 Google Cloud Platform 部署管理器模板创建存储桶

    我正在尝试使用 GCP Deployment Manager 创建存储桶 我已经完成了快速入门指南并能够创建一个compute v1 instance 但我正在尝试在 Google Cloud Storage 中创建一个存储桶 但无法获得除
  • 在 Win7 中的 ruby​​ 命令提示符下安装 Rubygems 时出错

    当我尝试在 Win7 32 位 中的 Ruby 命令提示符下安装 ruby gems 时 出现以下错误 请注意 我安装了 Ruby1 9 3 并已将 devkit DevKit tdm 32 4 5 2 20111229 1559 sfx
  • 使用backbone.js处理belongs_to关系

    我对backbone js有点陌生 我正在努力获取具有belong to关系的集合 我想获取用户列表 users GET 并且我想显示所有用户 但带有belongs to关联 例如显示用户的公司名称 有人知道解决办法吗 我正在将 Ruby
  • 在 jupyter 上安装 gnuplot

    我想用 gnuplot 绘制条形图 但我安装时遇到问题 我正在使用 jupyter anaconda 以下代码不适用于安装 conda install gnuplot py pip install gnuplot py pip instal
  • CSS/JS 中的动态 URL

    我正在拆分我的一个较大的应用程序 并引入一个 cdn url 来容纳 CSS javascript 和图像等常见对象 以避免重复 不过 我需要做的是为我们的开发环境提供单独的 URL 因此我可能有 http cdn dev example
  • 将数据 URI 转换为图像数据

    Converts data URI in image png format to an image data object param dataURL Base64 encoded string returns ImageData unde
  • 为什么 gcc 允许使用大于数组的字符串文字初始化 char 数组?

    int main char a 7 Network return 0 A 字符串字面量在 C 中是内部终止的空字符 因此 上面的代码应该给出编译错误 因为字符串文字的实际长度Network是 8 并且它不能放入char 7 array 然而