用指针修改字符串[重复]

2023-11-29

这两个代码必须改变字符2在角色中'4'

int main(int argc, char *argv[]){   
       char *s = "hello";   
       *(s+2)='4';
       printf( "%s\n",s);
       return 0;     
    }

当我运行此命令时,我会遇到分段错误:

int main(int argc, char *argv[]){   
   char *s = argv[1];   
   *(s+2)='4';
   printf( "%s\n",s);
   return 0;     
}

我知道还有其他方法可以做到这一点。这两个程序有什么区别?


在第一种情况下,您面临未定义的行为通过尝试修改字符串字面量。分段错误是常见的错误之一副作用 of UB.

在你的代码中,

 char *s = "hello";

essentially puts the starting address of the string literal "hello" into s. Now, is you want to modify the content of *s (or *(s+n), provided n does not go out of bounds), it will actually try to modify that string literal. As usually, the string literals are stored in the read-only memory, they are usually not allowed to be modified. Quoting from C11, chapter §6.4.5, String literals, (emphasis mine)

如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为是未定义的。

然而,在你的第二种情况下,你正在做

 char *s = argv[1];

这是把值argv[1] into s. Now, s指向string包含于argv[1]。这里,内容为argv[1] (or, argv[n],一般来说)不是只读的,它可以修改。所以,使用*s (or *(s+n), 假如n不越界),可以修改内容。

这个案例是定义的行为,因为根据 §5.1.2.2.2,程序启动

参数argc and argv和指向的字符串argv数组应可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。

所以,第二种情况是special使用时的情况argv[n],这是由C标准规则决定的,可修改的。

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

用指针修改字符串[重复] 的相关文章

  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • 如何动态加载包含非托管代码的原始程序集?(绕过“无法验证的代码失败策略检查”异常)

    我将举一个使用的例子系统 Data SQLite DLL http sqlite phxsoftware com 这是一个包含非托管代码的混合程序集 如果我执行这个 var assembly Assembly LoadFrom System
  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30
  • WP8.1 C# 绑定联系人图像

    信息很简单 我正在尝试创建一个可以显示用户联系人的应用程序 我也是一名自学成才的程序员 所以我在某些方面有编程经验 但总体来说我对数据绑定相对较新 首先 我有一个 ListView 控件 其中包含图像绑定
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • C++:将模板参数的模板类型成员添加为好友的正确语法?

    我有一个带有模板类型参数 tTRAIT 的类 我想加一个模板为好友type member aliastTRAIT 但我无法弄清楚语法 这可能吗 template
  • 无缝滚动瓷砖地图

    我正在开发一个自上而下的角色扮演游戏 并且想要实现无缝滚动地图 也就是说 当玩家探索世界时 地图之间没有加载屏幕 也没有通往下一个区域的 门 我有两种方法可以打破世界 在顶层 我有 区域 它只是 9 个 地图 的集合 这些区域仅由目录表示
  • StreamReader,C#,peek

    我有一个 StreamReader 它偶尔会检查它是否有更多内容可以从简单的文本文件中读取 它使用 peek 属性 问题是 当我使用 peek 时 位置发生了变化 尽管不应该发生 FileStream m fsReader new File
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • 如何填充两个样条线或直线系列之间的区域

    我有这个Chart 如何填充两个之间的区域Series S0 and S1 说蓝色和黄色Series 为此 我们编写了其中之一Paint事件 这里的ValueToPixelPosition https msdn microsoft com
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • EWS - 给予预约,获取预约的所有者副本

    在 EWS 中进行预约后 是否可以获得所有者的副本 例如 如果我登录为user1 我有user1创建的约会的副本user2 我有冒充权 我要编辑user2预约的副本 我怎样才能获得user2 s copy 您可以使用 PidLidClean
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 将数据框中的每个 x 个字符拆分为字符串

    我知道这里有一些关于每隔一段时间分割一个字符串的答案nth字符 例如this one https stackoverflow com questions 23208490 split each character in r and this

随机推荐

  • 当数组有子数组时 array_intersect 会抛出错误

    我正在尝试使用array intersect比较两个数组的数组 start array id gt 1 name gt Up action gt up start array id gt 3 name gt Down action gt d
  • JBoss Wildfly 与 Jersey Web 服务部署错误 JBAS011859:命名上下文是只读的

    我正在开发一个使用 Jersey Servlet 1 18 1 的 Java Web 服务项目 将我的 EAR 文件部署到 Jboss WildFly 8 1 0 时 我收到以下错误 并且我不确定为什么它会中断 因为同一个 EAR 文件在
  • 如何在 Google App Engine 的 ManyToOne 端按父实体过滤实体

    我使用谷歌应用程序引擎 当我尝试执行如下 JPA 查询时 SELECT p FROM Participant p WHERE p party id partyKey AND p name participantName 我收到以下错误 Ca
  • ng-repeat 动画不起作用

    我的 ng repeat 动画似乎不起作用 这是笨蛋 http plnkr co edit kYtzM9d0rzGmrniybz9c p preview 任何输入 1 您已注册两个模块 And Remove ng app来自 html 标签
  • 按钮悬停颜色更改动画 c#

    我创建了一个 Windows 窗体 它有 3 个按钮 因此 我想通过使用 mouseenter 事件来更改颜色的一键式按钮 工作正常 但我需要通过淡入或淡出的过渡来改变颜色 任何对此问题有答案的人请告诉我下面的代码 我将向您展示我的 mou
  • 通过 aws.push 部署到 Elastic Beanstalk 时保留某些现有文件

    我们在 EC2 服务器上的应用程序目录中有 SOLR 而不是在本地 git 存储库中 当我们将本地存储库推送到 EC2 时 它会删除 Solr 目录 我们已将目录名称放入 gitignore 文件中 但它仍然覆盖 SOLR 目录 我们如何防
  • IE 7 CTRL + 单击打开一个新窗口 - 如何抑制它?

    Is it possible to suppress the default IE 7 functionality when CTRL click on link opens a new window if so how Thanks Th
  • 如何在 SQL Server 2008 中从 IP 地址获取计算机名称?

    我必须从 SQL Server 中的 IP 地址获取计算机名称 我可以做些什么来完成我的任务 DB IPAdd MachineName Query select MachineName from DBTable where IPAdd yo
  • 在安卓中搜索

    我有一个应用程序 我希望在其中添加搜索功能 我正在尝试按照中所述实施developer android但是当我单击模拟器中的搜索时 活动没有启动 问题是什么 SearchActivity java public class SearchAc
  • 在 Spring Boot 中禁用自动日志记录配置

    我使用 spring boot 1 2 1 RELEASE 并注意到 spring 在启动时自动更改我的 log4j 配置 这是我的 春季 依赖项
  • 用于设置类的 CKEditor 插件

    我想做的是类似于本机前景色 背景颜色对话框 不同之处在于 它将直接在工具栏中包含带有颜色的按钮 所以一个插件必须有多个按钮 具有不同的样式 颜色 另一个问题是 这个原生插件设置了 CSScolor and background color特
  • 什么是“装饰器”以及它们如何使用?

    我很好奇 AngularJS 中的装饰器到底是什么 除了装饰器中的简介之外 网上没有太多关于装饰器的信息AngularJS 文档并在一个简短的 尽管有趣的 提及Youtube 视频 正如 Angular 的人所说 装饰器是 服务的装饰 允许
  • 音频和视频等大文件的数据库

    我的应用程序创建了大量文件 每个文件最大 100MB 目前我们将这些文件存储在运行良好的文件系统中 但我想知道是否有更好的解决方案将文件存储在某种文件数据库中 数据库的一个简单优点是它可以分割文件并存储在小块中 而不是一个 100mb 的文
  • 使用 shebang 通过 subprocess.call 执行 python 脚本

    我正在用 Python 3 编写一个 某种程度上 模块化应用程序 我想从中运行任意程序 该程序是在运行时指定的 而不一定是 python 脚本 所以我用例如 subprocess call spam i eggs o ham If spam
  • 带有自定义标签的 CSS 宽度

    我无法获取适用于我的自定义标签的宽度和高度属性 请参阅下面的代码 CSS x slider width 1000px height 300px border 1px black solid background color 0000ff H
  • 在.NET中获取用户的Exchange服务器和电子邮件地址

    嗨 我想知道我的用户的 Exchange 服务器的地址 假设她位于典型的 Windows 办公网络中 这是在 C 应用程序中 我已经有了用户的电子邮件地址 我在以下位置找到了它System DirectoryServices Account
  • 类依赖工具

    我正在寻找一个 最好是开源 工具 在给定大量 C C 代码的情况下 该工具将生成类 C 和 或文件 C 之间依赖关系的可视化或 XML 图表 这个想法是 如果您必须将代码转换为另一种语言 您希望能够首先编译最低级别的类 然后从那里开始构建
  • 在 Apache Flink 中使用 DynamoDB 流

    有人尝试过在 Apache Flink 中使用 DynamoDB 流吗 Flink 有一个 Kinesis 消费者 但我正在寻找如何直接使用 Dynamo 流 DataStream
  • Windbg:是否可以在我自己的程序中嵌入Windgb引擎?

    我想编写一个调试 诊断工具 它可以调用 Windbg 函数来检查转储文件 而不是编写 Windbg 扩展 这可能吗 有什么参考吗 多谢 您可以使用 dbghelp dll 中实现的调试 API 而不是 WinDbg 它记录在MSDN 该参考
  • 用指针修改字符串[重复]

    这个问题在这里已经有答案了 这两个代码必须改变字符2在角色中 4 int main int argc char argv char s hello s 2 4 printf s n s return 0 当我运行此命令时 我会遇到分段错误