一不小心就对未分配的内存进行访问和修改
问题出自《c 和指针》第十二章问题4: "讨论一些技巧,怎么省略双链表中根节点的值字段“
typedef struct NODE{
struct NODE * pwd;
struct NODE * nwd;
type value;
}Node;
习题答案第一种方法便是 给根节点这样分配内存 Node *root = (Node *)malloc(sizeof(Node) - sizeof(type) );
这样确实是没有对value进行内存分配。也可以对根节点的pwd、nwd进行访问和修改,只要你不去访问根节点的value就不会对未分配的内存越界操作。
但是如果结构体是这样声明的:
typedef struct NODE{
struct NODE * pwd;
type value;
struct NODE * nwd;
}Node
根节点的起始位置是556810848 也就是第一个元素的位置,而第二个需要的元素中间隔了一个要省略的元素。这样的话就导致访问第二个元素时访问了未分配的内存地址:556810864 导致越界访问
总结:如果想要在malloc上做手脚来省略某个字段的话,就要把这个字段放在最末尾。不然通过结构体访问它后面的非省略元素会导致越界访问。对未分配的动态内存进行非法访问可能会有以下两种问题:
1.被访问的内存可能保存了其他变量的值。对它进行修改会破坏那个变量,这种bug很难发现。
2. 在malloc 和free 的 有些 实现中,它们以链表的形式维护可用的内存池。对分配的内存之外的区域进行访问可能会破坏这个链表,这有可能产生异常,从而终止程序。
转载于:https://www.cnblogs.com/BMing/p/10606496.html
一不小心就对未分配的内存进行访问和修改相关推荐
- 计算机怎么把磁盘内存分给其他盘,怎么把未分配的内存分给d盘
1. win7系统怎么将未分配的空间分配到d盘 win7将未分配的空间磁盘分区方法:在桌面的"计算机"图标上单击鼠标右键选择管理,打开计算机管理窗口,然后找到磁盘管理. 现在在未分 ...
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 1 2 3 4 5 6 ...
- 使用CRT调试内存分配堆来找出未释放的内存空间
忘记释放已经分配的内存是一种常见的编程错误,当然我指的是在C++编程当中,例如下面的代码里面就存在一个忘记释放内存的编程错误.我个人觉得忘记释放内存的编程错误是不可避免的,毕竟程序员都是人,困了,心情 ...
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
本篇是基于云天之巅博主音视频开发中的一个bug,继而查阅了的一点资料:本篇转载自博客园某博主的随笔,并做极少量的修改,原文地址:https://www.cnblogs.com/haore147/p/3 ...
- C/C++内存分配、内存区划分、常量存储区、堆、栈、自由存储区、全局区(静态区)、代码区
C/C++内存分配.内存区划分.常量存储区.堆.栈.自由存储区.全局区 C++中,内存分成几个区: 栈(stack) 堆(heap) 自由存储区 全局/静态存储区 常量存储区 代码区 对于C++的内存 ...
- 研一寒假02-指针_new分配内存_使用new来创建动态数组_使用动态数组_使用delete来释放new分配的内存...
#---------------------------------指针-----------------------------------# #include <iostream> i ...
- vs使用未初始化的内存怎么解决_遇到C语言内存错误怎么办?一定要找准这六个原因...
一.没有为指针分配内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.结构体成员指针未初始化 struct student ...
- 【Elasticsearch】es 集群健康值 红色 red 分片 未分配
1.概述 转载:https://zhuanlan.zhihu.com/p/101608973 转载这篇文章是因为根据我的文章 [Elasticsearch]elasticsearch 7.x 查看分片 ...
- 不能返回函数内部new分配的内存的引用_JNI开发之局部引用、全局引用和弱全局引用(三)...
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景 ...
- 【C进阶】之动态内存分配及内存操作函数
动态内存分配及内存操作函数 1 动态内存分配的介绍 2 malloc和free函数 3 测试代码 4 goto的使用场合,常用于出错处理 5 memset() 6 memcpy() 7 memcmp( ...
最新文章
- DL之ShuffleNet:ShuffleNet算法的架构详解
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences
- ​稳健、可靠全真即时通信网的架构与应用
- schema约束文档与xml文件详解
- lambdas for_Java 8发布了! — Lambdas教程
- 《游戏设计师修炼之道:数据驱动的游戏设计》一3.8小结
- python程序设计知识点汇总_Python入门知识点汇总
- 羽毛球 vs. 软件开发
- 1 各种Linux系统下载镜像站(系统)
- 破解还原卡的方法总结
- 抖音、快手无水印视频下载【现已支持所有平台】
- MySQL常用SQL语句大全
- SQLSTATE[23000]: Integrity constraint violation:1062 Duplicate entry1664187678631531497821000‘ 解决办法
- 【转】十大顶级奢侈品服装品牌
- 进行拨测的主要目的都有哪些?
- JAVA一些基础概念
- unity3d实现像素游戏的精确碰撞判定
- Kaggle比赛整理
- Java8常用循环遍历操作方式的效率对比
- VA虚拟应用匠心独妙,细节的精彩
热门文章
- 高可用MySQL:构建健壮的数据中心
- 成功演示六要素之三——具体
- 深度学习:循环神经网络RNN的变体
- php for of,JavaScript中 for、for in、for of、forEach的用法小结(附代码)
- 蓝桥杯2017年第八届C/C++省赛C组第一题-贪吃蛇长度
- AndroidStudio 文件目录如何“刷新”
- No pubspec.yaml file found. This command should be run from the root of your Flutter project. Do not
- ubuntu搭建简单http服务器
- environment variable is too large 2047
- 32. My Experiences in the Factories 我在工厂的经历