结构体与字符串文字?只读与读写? [复制]

2024-01-02

C99 标准是否允许写入复合文字(结构)?它似乎不提供对文字字符串的写入。我问这个是因为它说C 编程:现代方法,第二版 http://knking.com/books/c2/index.html第 406 页。

问:允许指向复合文字的指针似乎可以修改文字。是这样吗?

答:是的。复合文字是可以修改的左值。

但是,我不太明白它是如何工作的,以及它如何与您所使用的字符串文字一起工作当然无法修改。

char *foo = "foo bar";
struct bar { char *a; int g; };
struct bar *baz = &(struct bar){.a = "foo bar", .g = 5};

int main () {
  // Segfaults
  // (baz->a)[0] = 'X';
  // printf( "%s", baz->a );

  // Segfaults
  // foo[0] = 'a';
  // printf("%s", foo);

  baz->g = 9;
  printf("%d", baz->g);

  return 0;
}

你可以在我的段错误列表中看到,写信给baz->a导致段错误。但是,写信给baz->g才不是。为什么其中一个会导致段错误而不是另一个?结构体文字与字符串文字有何不同?为什么结构体文字不也被放入内存的只读部分,并且这两者的行为是定义还是未定义(标准问题)?


首先,您的结构文字有一个初始化为字符串文字的指针成员。结构体本身的成员是可写的,包括指针成员。只有字符串文字的内容是不可写的。

字符串文字从一开始就是语言的一部分,而结构文字(正式称为复合文字)是 C99 中最近添加的内容。到那时,已经存在许多将字符串文字放置在只读存储器中的实现,特别是在具有少量 RAM 的嵌入式系统上。到那时,标准的设计者可以选择要求将字符串文字移动到可写位置,允许结构文字为只读,或者保持原样。这三种解决方案都不是理想的,所以看起来他们走的是阻力最小的道路,一切都保持原样。

C99 标准是否允许写入复合文字(结构)?

C99 标准没有明确禁止写入使用复合文字初始化的数据对象。这与字符串文字不同,字符串文字的修改被标准视为未定义的行为。

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

结构体与字符串文字?只读与读写? [复制] 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 多重排序的 URL 查询字符串约定

    我有一个 RESTful Web 应用程序 支持对项目集合进行多个排序字段 是否存在将这些排序字段编码到 URL 的查询字符串中的通用约定 我正在考虑如下的模式 http myapp com books sort author asc da
  • 如何在c#中获取组合键

    How can I capture Ctrl Alt K P keys on a C form thanks 这是一个和弦 如果不记住看到和弦的第一个击键 就无法检测到它 这有效 public partial class Form1 For
  • gitlab runner 请求的 URL 返回错误:403

    我目前正在使用 gitlab com 不是本地安装 及其多运行程序进行 CI 集成 这在我的一个项目中效果很好 但在另一个项目中却失败了 我的主机使用的是 2012R2 MSBuild 版本为 14 0 23107 0 我知道下面的错误显示
  • 将函数映射到两个输入列表

    我有一个函数想要用多组输入进行测试 假设函数是 f a gt b gt c 现在我有两个输入列表 inputA a inputB b For inputA i 我要评价f input i对于列表中的每个元素inputB i 我知道我需要几个
  • React - 预填充表单

    我需要预先填充一个表单 以便用户可以编辑他们之前创建的博客 我正在寻找在 React 中执行此操作的最佳实践方法 我目前正在通过 props 将值传递给组件 然后将状态属性设置为等于 props 属性 但我读到这是一种反模式 我理解 真理之
  • 使用属性名称设置属性值[重复]

    这个问题在这里已经有答案了 可能的重复 我可以使用 Reflection 设置属性值吗 https stackoverflow com questions 7718792 can i set a property value with re
  • 在 React Native 中,redux 状态在内存中保留多长时间

    我试图了解如何在我的反应本机应用程序中管理 redux 状态 特别是 我试图弄清楚当我的应用程序最小化或设备关闭时会发生什么 有了这些知识 我就可以最好地找出如何持久化状态 并为重置 redux 状态可能出现的任何非法状态做好准备 如果重置
  • 如何检测浏览器支持requestFullscreen

    如何检测浏览器支持requestFullscreen or not 我有下面这些代码可以使 chrome safari firefox 和 opera 不完全工作 使文档全屏显示 但我想检测浏览器支持requestFullscreen或不
  • 使用 Linq 创建交叉表结果[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以使用 LINQ 透视数据 https stackoverflow com questions 167304 is it possible to pivot data using linq 我想
  • UIManagedDocument OpenWithCompletionHandler 永远不会返回

    我遇到了一个奇怪的问题 我确信我对代码中其他地方的文件做了一些操作 并且它没有正确关闭或其他什么 但现在它处于报告为已关闭的状态 但当我调用 OpenWithCompletionHandler 时它永远不会返回 见下文 if the fil
  • 显示文件或对象之间的差异

    R 中有没有一种方法可以比较对象并返回有用的信息 例如差异在哪里 我需要比较文件 但愿意将它们读入 data frames 这可能可以通过命令行更好地处理 但我想将我的测试封装到一个 R 脚本中 我的下一次尝试是使用 ddply 将每一行发
  • 在第二台显示器上打开新的浏览器页面

    嗯 简单的情况 是否可以通过 Web 应用程序检测用户是否具有双显示器设置 如果可能的话 是否可以在第二台显示器上打开子浏览器页面 以便新窗口不会与旧窗口重叠 我问的原因是 我正在开发一个网络应用程序 并且家里有一个双显示器系统 当我转到该
  • 在 Kotlin 中读取所有输入行的简洁方法

    进行编码挑战时的常见模式是读取多行输入 假设您事先不知道有多少行 您想要读取直到 EOF readLine 返回 null 另外作为前言 我不想依赖 java utils 因为我是用 KotlinNative 编码的 所以没有 Scanne
  • 如何使用存储在字段值中的正则表达式执行正则表达式查找?

    给定以下模型 from django db import models from django conf import settings class UserMessage models Model user models ForeignK
  • “error_description”:“AADSTS70002:请求正文必须包含以下参数:'client_secret 或 client_assertion'

    我使用了代码https github com AzureAD azure activedirectory library for java blob master src samples public client app sample s
  • SparkContext 错误 - 文件未找到 /tmp/spark-events 不存在

    通过 API 调用运行 Python Spark 应用程序 提交申请时 响应 失败 通过 SSH 连接到 Worker 我的Python应用程序存在于 root spark work driver id wordcount py 错误可以在
  • 公制距离的正则表达式

    我想要一个RegEx匹配公制系统中的距离值 这个正则表达式应该匹配12m 100cm 1km忽略空白 尝试这个 0 1 9 d s da yzafpn mcdhkMGTPEZY m
  • 将带有分号分隔符的 CSV 导入 MongoDB 数据库

    我刚刚尝试将 CSV 文件 带有分号 分隔符 导入到 MongoDB 数据库中 我管理导入mongoimport d mydb c things type csv file files csv headerline但结果不是我所期望的 这些
  • 使用 gtsummary::tbl_regression 以科学计数法显示 p 值?

    非常感谢您的帮助 包括p values for gtsummary tbl regression函数于科学计数法 我正在使用大数据 显示 3 会非常有用p 值的小数点 gt 0 001 and p 值 一个有代表性的例子 load pack
  • 结构体与字符串文字?只读与读写? [复制]

    这个问题在这里已经有答案了 C99 标准是否允许写入复合文字 结构 它似乎不提供对文字字符串的写入 我问这个是因为它说C 编程 现代方法 第二版 http knking com books c2 index html第 406 页 问 允许