我应该如何为C字符串字符数组分配内存?

2023-11-23

因此,在尝试学习如何在 C++ 中使用 C 字符串时,我遇到了内存分配问题。

这里的想法是创建一个格式为 (s1 + sep + s2) 的新字符串 我使用的文本提供了标题,因此我无法更改它,但我在尝试设置 char str[] 的大小时遇到​​了问题。我收到一条错误消息,指出 sLength 不是常量,因此不能用于设置数组的大小。我对 C++ 比较陌生,所以这是一个由两部分组成的问题。

  1. 这个策略实际上是为新数组分配内存吗?

  2. 如果无法使用 strlen(char*) 获取常量值,如何正确设置数组大小?

    char* concatStrings(char* s1, char* s2, char sep){
        int sLength = strlen(s1) + strlen(s2) + 3; 
        //+1 for char sep +2 for \0 at end of string
        char *str = new char[sLength];
        strcpy (str, s1);
        str [sLength(s1)] = sep;
        strcat (str, s2);
        return str;
    }
    

进行了编辑,所以现在我没有收到编译器错误,但是......

该函数的调用在这里:

    char* str = concatStrings("Here is String one", "Here is String two" , c);
    cout<< str;

我的输出变成:

这是字符串onec==================22221/21/21/21/2 /(etc.)/ 这是字符串二


错误是返回局部数组变量的地址str.它的范围在函数内concatStrings()您声明的位置,一旦控制权从函数返回就无法访问。

要从外部访问它,您需要使用以下命令从堆中为字符串动态分配内存new操作员。

char* concatStrings(char* s1, char* s2, char sep){
    int s1Length = strlen(s1);
    int sLength = s1Length + strlen(s2) + 2; 
    // +1 for sep and +1 \0 at end of string
    char* str = new char[sLength];
    strcpy (str, s1);
    // Use strlen here instead of sizeof()
    str [s1Length] = sep;
    str [s1Length + 1] = '\0';
    strcat (str, s2);
    return str;
}

程序完成后,使用返回的字符串concatStrings它应该确保通过调用来释放内存delete

char* str = concatStrings(s1, s2, sep);

// Do something

// Free up memory used by str
delete[] str; 

这里必须使用delete[]而不是delete,否则会导致未定义的行为

我还编辑了concatStrings()使用函数strlen代替sizeof

更新:感谢您指出我们只需要执行 +2 而不是 +3,并确保需要在后面附加 '\0'str1 and sep在调用之前strcat

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

我应该如何为C字符串字符数组分配内存? 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • WCF 自托管应用程序可以使用 app.config 自动创建 ServiceHost 吗?

    当我创建自托管 wcf 应用程序时 我为要公开的每个服务创建 ServiceHost 对象 然后它会在 app config 中查找 匹配服务器名称 然后提取关联的端点地址和合约 有没有办法为 app config 中列出的每个服务自动创建
  • SceneKit:理解SCNNode的pivot属性

    目标是增加 SCNBox 的长度 使其仅在 z 正方向上增长 这个答案建议玩pivot财产 然而 该文档的pivotSCNNode页面上属性稀疏 SCNBox页面上没有任何内容 有人可以解释一下如何pivot物业工作 改变节点的pivot从
  • 隐藏任务栏中工作进程的图标

    如何在vb net中隐藏任务栏中的工作进程图标 Dim startInfo As New ProcessStartInfo Some Process startInfo WindowStyle System Diagnostics Proc
  • IIS7重写映射正则表达式?

    是否可以在重写映射中使用正则表达式 例如
  • 如何在Python中使用Pandas合并后找到删除的数据?

    我的数据框如下所示 我正在使用 Pandas 合并函数来合并两个数据框 并且我试图找到被删除的行 Pandas 或 python 有没有办法跟踪这个 df1 pd DataFrame Name A B C Age 34 23 90 df2
  • 多个序列的惰性笛卡尔积(序列的序列)

    你能建议更简单 更清晰的方法来编写这个函数吗 let cartesian product sequences let step acc sequence seq for x in acc do for y in sequence do yi
  • CRM 2016 FakeXrmEasy N:N 关系

    我正在尝试使用FakeXrmEasy为 CRM Online 2016 执行一些单元测试 但我在设置具有 N N 关系的测试之一时遇到问题 以下代码设置了一个包含 2 个实体的 Faked Context 并初始化了一个 Faked Org
  • 使用 AngularJS 时如何转义大括号以显示在页面上?

    我希望用户看到双花括号 但 Angular 会自动绑定它们 这是相反的情况这个问题他们不希望在页面加载时看到用于绑定的大括号 我希望用户看到这个 My name is person name 但 Angular 取代了 person nam
  • 如何更改 vim 中未使用的背景颜色?

    如何更改 vim 编辑器未使用的 底部部分 希望这张照片能澄清我可怕的描述 该部分由突出显示组 NonText 控制 因此 您可以在 colorcheme 行之后添加以下行 将背景颜色设置为蓝色 highlight NonText cter
  • 为什么 Dapper 无法返回多个插入的行 ID?

    我有一个 SQL Server 表 其中使用以下命令插入行 var sql DECLARE InsertedRows AS TABLE Id BIGINT INSERT INTO Person Name Age OUTPUT Inserte
  • 切换用户或重新使用 Instagram 进行身份验证

    继Instagram 文档我能够轻松验证用户身份并检索 access token 但现在我想更改 Instagram 帐户 这是不可能的 因为浏览器会自动调用我的回调 URL 因为我已经使用帐户登录 再次没有登录 授权表单 解释一下这里发生
  • 更新 Windows 后 Browser.ExecScript() 停止工作

    我已经为 WatiN 版本 2 1 建立了一个简单的测试平台 内容如下 var browser new IE browser GoTo http www google co il webpage doesn t matter really
  • Onclick 与 addEventListener [重复]

    这个问题在这里已经有答案了 我对使用 onclick onmousedown 作为 HTML 元素的属性有点困惑 Such as
  • 在 Eclipse 中编译 C++

    尝试使用 Eclipse CDT 插件来编译一个简单的 C 应用程序 我创建一个新的 C 项目 并添加 1 个文件 test cpp 并将其编码为 Hello world 例子 include
  • 恐慌:缺少“arm”CPUS 的仿真器引擎程序

    我遇到了与下面链接中提到的相同的问题 但是这个问题已被搁置 我仍在寻找解决方案 https stackoverflow com questions 27146511 panic missing emulator engine program
  • 如何在不刷新整页的情况下重置视口缩放?

    我有一个网页 其视口元标记的 用户可扩展 属性设置为 true Safari 参考 安卓参考 因此 使用可识别该属性的浏览器 例如 Mobile Safari Android 浏览器 的用户可以通过捏合来缩放页面 但是 有一个链接使用 AJ
  • 在为其他人制作的批处理文件中使用另一种语言(代码页)

    所以我有一个最初是英文的批处理文件工具 我已经翻译成各种其他语言 我的情况是许多语言都使用特殊字符 就我而言 它是德语 所以我可能会用英语 echo Administrative permissions required Detecting
  • 通过C++代码计算时间

    我知道这个问题已经被问过几次了 但没有一个人真正帮助我 所以再问一次 我正在使用 Windows XP 并运行 Visual Studio C 2008 我正在查找的所有代码都使用 time h 但我认为它可能在这里无法正常工作 因为结果让
  • Excel VBA 嵌套字典 - 访问项目

    Tim 是否可以从 clsMatrix 类中提取行键列表 像这样的东西 Sub KEYS Dim KEY LIST As Variant KEY LIST TABLES UDLY dR KEYS End Sub 然后 我可以循环浏览表以提取
  • 我应该如何为C字符串字符数组分配内存?

    因此 在尝试学习如何在 C 中使用 C 字符串时 我遇到了内存分配问题 这里的想法是创建一个格式为 s1 sep s2 的新字符串 我使用的文本提供了标题 因此我无法更改它 但我在尝试设置 char str 的大小时遇到 了问题 我收到一条