memset 不适用于指向字符的指针

2023-12-29

下面的代码有什么问题? memset 应该与指向要填充的内存块的指针一起使用。但此代码在控制台中显示问题,提示分段错误(核心已转储)

#include<iostream>
#include <cstring>
using namespace std;

int main(int argc, char** argv)
{
    char* name = "SAMPLE TEXT";
    memset(name , '*', 6);
    cout << name << endl;
    return 0;
}

你被 C++ 中一个非常古老的向后兼容性问题绊倒了,它继承自 C,并且可以追溯到 C++ 存在的时代。was没有这样的事情const。字符串文字有类型const char [n],但是,除非您告诉编译器您不需要与 1990 年之前的代码兼容,否则它会默默地允许您设置char *变量来指向它们。但它won't允许您通过这样的指针进行写入。实际内存(只要可能)被标记为只读;您观察到的“分段错误”错误是操作系统报告尝试写入只读内存的方式。

就语言规范而言,写入const数据通过非const指针——无论你如何设置——都有“未定义的行为”,这是一种奇特的说法,“程序不正确,但编译器不必发出诊断,如果你得到一个已编译的可执行文件,它会可能做anything“分段错误”几乎总是意味着您的程序在某个地方有未定义的行为。

如果我使用适当的设置编译您的程序,我确实会收到错误:

$ g++ -std=gnu++11 -Wall -Werror test.cc
test.cc: In function ‘int main(int, char**)’:
test.cc:7:19: error: ISO C++ forbids converting a string constant to ‘char*’
[-Werror=write-strings]
      char* name = "SAMPLE TEXT";
                   ^~~~~~~~~~~~~

直到您获得足够的技能来知道何时不同的设置更合适,编译all你的 C++ 程序-std=gnu++11 -Wall -Werror,或者任何你的编译器的等价物。 (您似乎使用的是 Unix 风格的操作系统,因此这些设置应该有效。您可能还想要-g and/or -O.)

您的程序可以通过将其更改为 read 来运行

#include <iostream>
#include <cstring>

int
main()
{
    char name[] = "SAMPLE TEXT";
    std::memset(name, '*', 6);
    std::cout << name << '\n';
    return 0;
}

=>

$ g++ -std=c++11 -Wall -Werror test.cc
$ ./a.out
****** TEXT

修复该错误的更改来自char *name to char name[];我还改变了其他一些东西,但只是为了展示更好的风格。其作用是强制编译器将字符串文字复制到writable进入时的记忆main. Why确实如此,在这里解释起来需要很长时间;查阅一本好的 C++ 教科书。

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

memset 不适用于指向字符的指针 的相关文章

  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可

随机推荐

  • javascript onmouseout 应用于由孩子触发的 div

    我无法通过谷歌找到解决方案 但我认为这将是一个相当常见的问题 我有一个 div 我已经应用了 onmouseout 事件处理程序 该处理程序用于使用 jquerys slideup 函数滚动菜单 因为我希望鼠标离开时隐藏菜单 问题是该 di
  • 检查 Service Worker 中的窗口是否处于活动状态

    我正在尝试运行一个在窗口处于非活动状态时发送推送通知的 Web 应用程序 为此 我有一个 Service Worker 来帮助接收来自我的 php 服务器的通知 通过 Firebase 但是 我不确定如何通过我的服务工作人员检查窗口是否处于
  • 替换 Google App Engine (GAE) 中的 PIL (ImageDraw) 功能

    因此 Google App Engine 看起来不会包含 Python 图像库 有一个图片API http code google com appengine docs python images 但它微不足道 不足以满足我的需要 我想知道
  • Android 互联网连接检查问题

    我是 Android 开发新手 正在开发一个 Android 应用程序 该应用程序需要手机通过 Wifi EDGE 或 3G 连接到互联网 这是我用来检查互联网连接是否可用的代码 public static boolean isConnec
  • 在文件系统中移动该类后,出现“Class XXX 不是有效实体或映射的超类”

    我在 Aib PlatformBundle Entity User php 中有一个实体类 我尝试通过以下方式创建其表单类没有任何问题 php 应用程序 控制台学说 生成 表单 AibPlatformBundle 用户 现在我已将命名空间更
  • 如何获取文本的子串?

    我的文本长度约为 700 我怎样才能只得到大约 30 个前字符 如果你的文字在your text变量 您可以使用 your text 0 29
  • 在 jQuery 中将 JSON 数组转换为 HTML 表

    有没有一种非常简单的方法可以获取 JSON 对象数组并将其转换为 HTML 表 不包括一些字段 或者我必须手动执行此操作 使用 jQuery 将使这变得更简单 以下代码将获取一个数组数组并将它们存储转换为行和单元格 getJSON url
  • 泽西岛 URL 转发

    在 Jersey REST 方法中 我想转发到另一个网站 我怎样才能做到这一点 Path public class News GET Produces MediaType TEXT HTML Path go news id public S
  • 如何基于通用类型“T”初始化 TypeORM 存储库?

    我想启动一个基于通用类型的 TypeORM 存储库 例如 import Connection Repository from typeorm export class GenericService
  • 输入类型数字“仅数字值”验证

    我如何验证输入type number 仅当值是数字或 null 时才有效 仅使用响应式表单 无指令 仅数字 0 9 和 允许 不允许有 e 或任何其他字符 到目前为止我尝试过的 模板
  • 修改linux内核定时器

    我必须运行延迟敏感的应用程序 并且被要求将计时器分辨率更改为 1000 Hz 或更高 我在网上搜索了一下 找到了有关 CONFIG HZ 等的页面 但是 文件中似乎还有其他几个相关设置 因此我想确保不会弄乱这些设置 我在这里发布一些输出 c
  • C++:指向 std::string 转换的 char 指针是否复制内容?

    当我转换一个char to std string使用构造函数 char ps Hello std string str ps 我知道 std 容器在被要求存储值时倾向于复制值 是复制整个字符串还是仅复制指针 如果之后我这样做str Bye
  • 包“com.sun.webkit.dom”在模块“javafx.web”中声明,该模块不会将其导出到模块

    试图从Java 8 to Java 9 我得到这个错误 包 com sun webkit dom 在模块 javafx web 中声明 其中 不将其导出到模块 我该如何解决这个问题 以便预编译器 Intellij 和运行时我不明白这个问题
  • 语法平衡问题

    是否可以强制灵气提升以这种方式表现 生成的语法可以根据一些运行时可计算的条件 规则 速率进行调整 例如 输入由语言结构组成 这会在解析过程中导致不同的选择 有些更频繁 另一些则更少 但替代方案的顺序会影响效率 即语法的运行时最优性 在某些情
  • 上标和下标有 Ansi 转义序列吗?

    我正在玩弄 ANSI 转义序列 例如 echo e e 91mHello e m 在 Linux 控制台上显示彩色文本 现在我尝试使用上标和下标输出 例如a b I read here http www inwap com pdp10 an
  • Jackson JSON 和 Hibernate JPA 的无限递归问题(又一个)

    我找到了大量这方面的资源 例如这个 Jackson JSON 和 Hibernate JPA 问题的无限递归 https stackoverflow com questions 3325387 infinite recursion with
  • 使用 asp.net mvc 用逗号分隔数字

    我正在开发 MVC2 应用程序 我使用数据注释来验证数据 客户端和服务器端 我的模型中有几个字段只允许十进制值 一旦用户输入十进制值 我希望将其转换为逗号分隔的更易读的格式 例如 1200 应格式化为 1 200 而 500 应保持原样 这
  • JavaScript API 不适用于 Excel 2013?

    我刚刚收到了针对我提交的一个加载项的更改建议报告 它说Your add in is not working in the Excel 2013 client on Windows 7 with Internet Explorer 11 我一
  • 如何将 request.getParameterNames 放入字符串列表中?

    是否可以得到request getParameterNames 作为字符串列表 我需要以这种形式提供它 Just 构造 http docs oracle com javase 6 docs api java util ArrayList h
  • memset 不适用于指向字符的指针

    下面的代码有什么问题 memset 应该与指向要填充的内存块的指针一起使用 但此代码在控制台中显示问题 提示分段错误 核心已转储 include