首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何释放C中字符串中“0”之后的内存?

如何释放C中字符串中“0”之后的内存?
EN

Stack Overflow用户
提问于 2022-11-07 09:21:20
回答 1查看 57关注 0票数 2

我用C编写了一个非常小的空格修整函数,它只是将有效字符复制到一个副本中,并将一个'\0'放在末尾。

代码语言:javascript
运行
AI代码解释
复制
char *trim(char *line) {
    char *out = strdup(line);

    // copy valid chars to duplicate
    char *op = out;
    char *ip = line;
    while (*ip != '\0') {
        if (!isspace(*ip)) {
            *op = *ip;
            op++;
        }
        ip++;
    }
    // put second '\0' in string, although more memory is dedicated to it
    *op = '\0';

    return out;
}

这意味着使用类似于{'F', ' ', 'o', ' ', ' ', 'o', '\0'}的东西调用这个函数应该返回字符串{'F', 'o', 'o', '\0', ' ', 'o', '\0'}

这看起来很低效。我宁愿返回:{'F', 'o', 'o', '\0'}

问题

  1. 在字符串中多次出现\0是什么意思?当我用strlen().
  2. How复制字符串,然后再用strdup()检查它的长度时,它就开始不正常地运行了,我是否在第一个\0之后释放内存,使它不再专门用于字符串?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-07 09:39:54

  1. 如何在第一个\0之后释放内存,使其不再用于字符串?

你可以这样做:

代码语言:javascript
运行
AI代码解释
复制
char *NewSpace = realloc(out, strlen(out) + 1);
if (NewSpace)
    out = NewSpace;

测试NewSpace是防止realloc失败的一个防范措施,在这种情况下,它返回一个空指针,旧内存仍然被分配。(realloc在缩短分配时不应失败,但防范问题是一种很好的做法。)

这只能通过动态分配的内存来完成。您的代码显示了out的空间是用strdup分配的,所以这是动态分配的内存。

请注意,内存分配例程通常以16字节或类似的单位工作,因此将7字节重新分配到4不会对内存的使用产生任何影响。将10兆字节重新分配到一个字节可能会释放内存。(这不是C标准所保证的,有些实现可能选择不这样做。)

  1. 在字符串中多次出现\0意味着什么?

不可能在字符串中多次出现空字符,因为字符串被定义为以第一个空字符结尾的字符序列。

可以有一个数组,其中包含多个空字符。数组是同一类型的元素序列,其元素可以具有该类型的任何值,包括多个零。数组通常用于保存字符串。当数组或数组的一部分用于保存字符串时,字符串将以第一个空字符结尾。数组中的其余元素将不被作为字符串运行的函数使用。

在C中,数组有固定的内存。(对于所谓的“可变长度数组”,在创建数组时,长度是固定的。它可能在到达数组定义的不同代码执行实例中发生变化,但在特定实例中不发生变化。)在很大程度上,数组是内存,而这并不会根据其中的数据而改变。相反,字符串是由其内容定义的;它以其第一个空字符结束。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74350465

复制
相关文章
无法在此iPhone上激活Touch ID,怎么解决?
Touch ID是苹果公司的指纹识别功能,允许用户解锁iPhone或iPad、在苹果商店购物,以及在应用程序中验证Apple Pay等等。
莉莉的碎碎念
2021/09/10
6.1K0
无法在此iPhone上激活Touch ID,怎么解决?
适当愉悦,自建 Minecraft 服务器
本文主要介绍自建 Minecraft 服务器的方法,可以使用提供的公有云服务,Minecraft 对虚拟机配置需求如下:
宋天伦
2020/07/16
7.1K1
适当愉悦,自建 Minecraft 服务器
Python 数组操作_python中数组的表示形式
在python中本身有着列表等数据结构,但是列表只是一种数据的存储容器,不具备任何计算能力。
全栈程序员站长
2022/09/22
3K0
Python 数组操作_python中数组的表示形式
【平面解析几何】直线方程的表示形式
表示与 轴、 轴相交,且与 轴截距为 、与 轴截距为 的直线
攻城狮杰森
2022/06/03
1.8K0
springboot的资源请求验证
基于SpringBoot的资源请求验证(Aspectj和Interceptor两方式实现)附JWT验证token 前言 ​ 在项目中,我们需要对前端请求的资源进行验证,判断是否具有相应的权限。比如某写资源只有在登录之后才有请求权限。本章以请求之前是否登录为权限。
崔笑颜
2020/06/08
8570
VS2010 \...\bin\rcdll.dll 无法找到资源编译器
版权声明:本文为博主原创文章,未经博主允许不得
acoolgiser
2019/01/16
1.3K0
用文字云的形式表示什么款式最畅销
前一文我们讲述了两种在Power BI中展示Top款的方式,我们有时候其实不需要具体的数字,只需直观感受,例如如下这种:
wujunmin
2021/09/07
8810
用文字云的形式表示什么款式最畅销
图解计算机中数据的表示形式
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2021/02/05
3K0
图解计算机中数据的表示形式
VirtualBox克隆后无法找到网卡的问题
Virtualbox现在更新到了4.1.6版本,我记得在之前的版本中,镜像的克隆只能通过命令行的方式来进行,现在已经可以通过界面来进行克隆了,可以说非常的方便。
大江小浪
2018/07/25
1.3K0
VirtualBox克隆后无法找到网卡的问题
skywalking根据文本信息找到对应的请求
在定位问题的时候,有时候需要找到导致问题出现的那个请求,比如下单。但是只有订单号,怎么去找呢? 目前我们一般是根据下单时间,然后再根据时间去找对应的请求,但是请求很多,需要一个一个打开请求内容去定位该订单的下单请求。 本文使用脚本的方式方便快速定位到对应的请求 根据时间和接口名称获取批量请求 获取批量请求 curl 'http://sky.fy.qq.com/graphql' \ -H 'Content-Type: application/json;charset=UTF-8' \ --dat
十毛
2021/11/24
6070
VSCode 无法加载文件 ······,因为在此系统上禁止运行脚本
 原因:命令行执行策略,默认设置为Restricted不加载配置文件或运行脚本。需变更设置为RemoteSigned
超级小的大杯柠檬水
2023/05/06
1.4K0
VSCode 无法加载文件 ······,因为在此系统上禁止运行脚本
C++核心准则E.19:如果无法选择适当的资源句柄,使用final_action表现清除处理​
finally is less verbose and harder to get wrong than try/catch.
面向对象思考
2020/08/10
5570
解决 cnpm : 无法加载文件 因为在此系统上禁止运行脚本
执行命令行set-ExecutionPolicy RemoteSigned 选y 即可
kirin
2021/02/26
7.1K0
解决 cnpm : 无法加载文件 因为在此系统上禁止运行脚本
如何找到自己的服务器
4.点击自己云服务器的实例id后,就可以看见服务器的基本信息、弹性网卡、安全组等等。
逸轩
2021/09/16
6.9K0
无法转换为内部表示
系统查询表记录时出现“java.sql.SQLException: 无法转换为内部表示”异常,抛出的异常信息如下:
程序新视界
2022/11/30
7040
修复WebView资源未找到导致的崩溃问题
近期 应用新增了很多的崩溃,分析特征,发现崩溃集中在5.0-5.1.1系统上,崩溃的日志如下
技术小黑屋
2020/11/10
2.5K0
linux上找到可用的网络接口
在 Linux 中查找可用的网络接口 我们可以通过几种方式找到可用的网卡。在本指南中,我们将讨论列出 Linux 中网络接口卡的 10 种方法。 1. 使用 ifconfig 命令列出网络接口 使用ifconfig命令查找网络接口详细信息的最常用方法。我相信一些 Linux 用户可能仍在使用它。 $ ifconfig -a enp5s0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 24:b6:fd:37:8b:29 txqueuelen 1000 (Eth
入门笔记
2022/06/02
2.4K0
无法为 WSDD 操作找到匹配的 Java 操作
我发现了错误。 只需要把“AndrQues”改成“andrQues”,程序就可以正常运行了。
matinal
2023/10/13
1960
Ajax请求($.ajax())中data属性传参数的形式
实现Ajax提交数据进行请求,其中data属性设置传参的方法有好几种形式,如下: //第一种写法(把参数拼接在URL中,data属性设为空{ })
PM吃瓜
2019/08/12
3.9K0
点击加载更多

相似问题

而网络报废这个错误显示是不可接受的!无法在此服务器上找到所请求资源的适当表示形式。

19

无法接受在此服务器上找不到所请求资源的适当表示形式。此错误是由Mod_Security生成的

116

在此服务器上找不到所请求资源的适当表示形式。此错误是由Mod_Security生成的。

33

Django -未找到在此服务器上找不到请求的资源

146

获取此错误:源服务器未找到目标资源的当前表示形式,或不愿透露存在此表示形式。

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档