C语言,无法正常释放char*的空间
问题描述
#include <stdio.h>
#include <stdio.h>const int STRSIZR = 10;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));str = "string";printf("%s\n", str);free(str);
}
乍一看,这块代码没有什么问题。直接书写时vscode也没有进行报错,可运行后便会弹出错误:
free(): invalid pointer
问题原因
开启断点调试

在第一次分配空间之后,str指针指向分配好的地址 0x5555555592a0
再执行一步,

此时str指针指向了地址 0x555555556008,此处为字符串"string"的存放地址,即text 区域(也称为代码段)
造成两个问题
- 释放代码段区域的空间必然导致错误(错误诱发原因)
- 原有分配的内存空间丢失
或许这也是使用g++编译时提示ISO禁止将string转化为char*的原因之一

问题解决
#include <stdio.h>
#include <stdio.h>
#include <string.h>const int STRSIZR = 10;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));memset(str,0,STRSIZR*sizeof(char));strcat(str,"string");printf("%s\n", str);free(str);
}
拓展-结构体中的char*
#include <stdio.h>
#include <stdio.h>
#include <string.h>const int STRSIZR = 10;typedef struct node
{int index;char *name;
} Node;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));memset(str,0,STRSIZR*sizeof(char));Node *n = (Node *)malloc(sizeof(Node));memset(n, 0, sizeof(Node));n->name=str;printf("%s\n", n->name);free(n);
}
考虑以上代码,运行后不报错。可真的没有问题吗?
未必,仍然考虑内存管理。使用valgrind帮我们一探究竟
valgrind --leak-check=full ./program

是的,当我们释放Node的时候,其实只是释放了char* name这个指针(8个字节)的这块空间。而并不会将其对应的分配内存空间释放。
#include <stdio.h>
#include <stdio.h>
#include <string.h>const int STRSIZR = 10;typedef struct node
{int index;char *name;
} Node;int main()
{char *str = (char *)malloc(STRSIZR*sizeof(char));memset(str,0,STRSIZR*sizeof(char));Node *n = (Node *)malloc(sizeof(Node));memset(n, 0, sizeof(Node));n->name=str;printf("%s\n", n->name);free(n->name);free(n);
}
先释放内部的char*,再释放整个结构体!
相关文章:
C语言,无法正常释放char*的空间
问题描述 #include <stdio.h> #include <stdio.h>const int STRSIZR 10;int main() {char *str (char *)malloc(STRSIZR*sizeof(char));str "string";printf("%s\n", str);free(str); } 乍一看,这块代码没有什么问题。直接书写…...
重回C语言之老兵重装上阵(十五)C语言错误处理
C语言错误处理 在C语言中,错误处理是非常重要的一部分。C语言没有像高级语言(例如Python、Java)那样内建的异常处理机制(如try-catch),但它提供了几种方法来捕捉和处理错误。正确的错误处理可以提高程序的稳…...
基于微信的课堂助手小程序设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Effective C++ 规则50:了解 new 和 delete 的合理替换时机
1、背景 在 C 中,new 和 delete 是动态分配内存的核心操作符。然而,直接使用它们有时会增加程序的复杂性,甚至导致内存泄漏和其他问题。因此,了解何时替换 new 和 delete 并选择更适合的内存管理策略,是编写高效、健壮…...
Alfresco Content Services dockerCompose自动化部署详尽操作
Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 Alfresco Content Services(简称ACS)是一款功能完备的企业内容管理(ECM)解决方案,主要面向那些对企业级内容管理有高要求的组织。具体…...
学习第七十六行
提高github下载速度方法 1.github转码云 2.https://github.com.cnpmjs.org com后面加东西 对于面试笔试,最好方法刷力扣,1000题包进大厂的...
YOLOv11改进,YOLOv11检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等任务
摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…...
一个基于Python+Appium的手机自动化项目~~
本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…...
【后端开发】字节跳动青训营之性能分析工具pprof
性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接: 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…...
Linux:线程池和单例模式
一、普通线程池 1.1 线程池概念 线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价&…...
使用iis服务器模拟本地资源服务器unityaddressables热更新出错记录
editor中设置了using exculexing 模拟远程加载addressable可以实现资源热更新,build后的软件却没有成功。 iis服务器中mime中需要设置bundle的文件扩展名,时editor成功,build后失败 原因没有设置hash的扩展名,设置后editor和buil…...
TikTok广告投放优化策略:提升ROI的核心技巧
在短许多品牌和商家纷纷投入广告营销,争夺这片潜力巨大的市场。然而,在激烈的竞争环境中,如何精准有效地投放广告,优化广告效果,实现更高的投资回报率(ROI)成为了广告主关注的核心。 一. 精准受…...
Hash表
哈希表存储结构(开放寻址法,拉链法)字符串哈希方式(添加、查找h(x)) 常见从0~10^9映射到0~10^5就要对10^5取mod(取模一般要质数最好)但是可能会有冲突 1.拉链法:O(1),每…...
题解:P10972 I-Country
题目传送门 思路 因为占据的连通块的左端点先递减、后递增,右端点先递增、后递减,所以设 f i , j , l , r , x ( 0 / 1 ) , y ( 0 / 1 ) f_{i,j,l,r,x(0/1),y(0/1)} fi,j,l,r,x(0/1),y(0/1) 为前 i i i 行中,选择 j j j 个方格&#x…...
linux常用加固方式
目录 一.系统加固 二.ssh加固 三.换个隐蔽的端口 四.防火墙配置 五.用户权限管理 六.暴力破解防护 七.病毒防护 八.磁盘加密 九.双因素认证2FA 十.日志监控 十一.精简服务 一.系统加固 第一步:打好系统补丁 sudo apt update && sudo apt upgra…...
笔灵ai写作技术浅析(二):自然语言处理
一、词法分析(Lexical Analysis) 1.1 概述 词法分析是NLP的第一步,主要任务是将连续的文本分割成有意义的单元(词或词组),并对这些单元进行标注,如词性标注(POS tagging)。词法分析的质量直接影响后续的句法分析和语义理解。 1.2 技术细节 1.分词(Tokenization)…...
PyCharm介绍
PyCharm的官网是https://www.jetbrains.com/pycharm/。 以下是在PyCharm官网下载和安装软件的步骤: 下载步骤 打开浏览器,访问PyCharm的官网https://www.jetbrains.com/pycharm/。在官网首页,点击“Download”按钮进入下载页面。选择适合自…...
深度解析:基于Vue 3与Element Plus的学校管理系统技术实现
一、项目架构分析 1.1 技术栈全景 核心框架:Vue 3 TypeScript UI组件库:Element Plus(含图标动态注册) 状态管理:Pinia(用户状态持久化) 路由方案:Vue Router(动态路…...
Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…...
苍穹外卖 项目记录 day09 历史订单
文章目录 查询历史订单查询订单详情取消订单再来一单 查询历史订单 分页查询历史订单可以根据订单状态查询展示订单数据时,需要展示的数据包括:下单时间、订单状态、订单金额、订单明细(商品名称、图片) #OrderController/*** 历…...
3大核心问题解决:B站视频处理全流程指南从下载到去水印的实战方案
3大核心问题解决:B站视频处理全流程指南从下载到去水印的实战方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水…...
蓄电池与超级电容混合储能并网matlab/simulink仿真模型 (1)混合储能采用低通滤波...
蓄电池与超级电容混合储能并网matlab/simulink仿真模型 (1)混合储能采用低通滤波器进行功率分配,可有效抑制功率波动,并对超级电容的soc进行能量管理,soc较高时多放电,较低时少放电,soc较低时状…...
微信小程序框架详解
小程序包含一个描述整体程序的app实例和多个描述页面的page。其中app由三个文件构成:公共配置app.json、公共样式app.wxss、主体逻辑app.js。每个page最多由四个文件构成:页面配置page.json、页面结构page.wxml、页面样式page.wxss、页面主体逻辑page.js。 微信小程序的主体部…...
openclaw 配置教程:本地安装、网关接入与模型 API 配置完整说明
如果你在折腾 openclaw 配置,通常会发现真正影响使用体验的,不是把程序装上去,而是后面的模型来源怎么接、网关怎么起、控制面板怎么进,以及默认模型如何切换。只要这些环节没有理顺,就算安装完成,后续也很…...
vLLM+ERNIE-4.5-0.3B-PT部署全攻略:环境准备、服务启动、前端调用
vLLMERNIE-4.5-0.3B-PT部署全攻略:环境准备、服务启动、前端调用 1. 环境准备与模型部署 1.1 硬件与系统要求 在开始部署ERNIE-4.5-0.3B-PT模型前,需要确保你的系统满足以下最低配置要求: CPU:4核及以上,推荐支持A…...
如何通过智能检测实现微信社交关系的高效管理?
如何通过智能检测实现微信社交关系的高效管理? 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriends 在数字…...
2026年亲测有效:合肥无人机培训案例分享
行业痛点分析随着无人机技术的飞速发展,其在各个领域的应用越来越广泛。然而,无人机行业也面临着一些核心技术挑战。首先,无人机的操作和维护需要专业的知识和技能,而市场上缺乏足够的专业人才。根据行业数据显示,目前…...
FLUX.1-dev像素艺术生成实战:像素幻梦在RPG地图设计中的落地应用
FLUX.1-dev像素艺术生成实战:像素幻梦在RPG地图设计中的落地应用 1. 像素艺术生成新纪元 在独立游戏开发领域,像素艺术始终保持着独特的魅力。传统像素画创作需要艺术家逐格绘制,耗时耗力。而基于FLUX.1-dev模型的像素幻梦(Pixel Dream Wor…...
VideoAgentTrek-ScreenFilter开发环境配置:从零开始搭建Java调用示例
VideoAgentTrek-ScreenFilter开发环境配置:从零开始搭建Java调用示例 如果你是一名Java开发者,最近听说了VideoAgentTrek-ScreenFilter这个视频处理服务,想在自己的项目里试试看,但不知道从哪儿下手,那这篇文章就是为…...
如何用11款开源字体解锁创作可能?宝藏资源轻松上手游戏文字设计
如何用11款开源字体解锁创作可能?宝藏资源轻松上手游戏文字设计 【免费下载链接】HoYo-Glyphs Constructed scripts by HoYoverse 米哈游的架空文字 项目地址: https://gitcode.com/gh_mirrors/ho/HoYo-Glyphs 你是否曾在创作同人作品时,苦于找不…...
