问题出自《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

一不小心就对未分配的内存进行访问和修改相关推荐

  1. 计算机怎么把磁盘内存分给其他盘,怎么把未分配的内存分给d盘

    1. win7系统怎么将未分配的空间分配到d盘 win7将未分配的空间磁盘分区方法:在桌面的"计算机"图标上单击鼠标右键选择管理,打开计算机管理窗口,然后找到磁盘管理. 现在在未分 ...

  2. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 1 2 3 4 5 6 ...

  3. 使用CRT调试内存分配堆来找出未释放的内存空间

    忘记释放已经分配的内存是一种常见的编程错误,当然我指的是在C++编程当中,例如下面的代码里面就存在一个忘记释放内存的编程错误.我个人觉得忘记释放内存的编程错误是不可避免的,毕竟程序员都是人,困了,心情 ...

  4. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    本篇是基于云天之巅博主音视频开发中的一个bug,继而查阅了的一点资料:本篇转载自博客园某博主的随笔,并做极少量的修改,原文地址:https://www.cnblogs.com/haore147/p/3 ...

  5. C/C++内存分配、内存区划分、常量存储区、堆、栈、自由存储区、全局区(静态区)、代码区

    C/C++内存分配.内存区划分.常量存储区.堆.栈.自由存储区.全局区 C++中,内存分成几个区: 栈(stack) 堆(heap) 自由存储区 全局/静态存储区 常量存储区 代码区 对于C++的内存 ...

  6. 研一寒假02-指针_new分配内存_使用new来创建动态数组_使用动态数组_使用delete来释放new分配的内存...

    #---------------------------------指针-----------------------------------# #include <iostream> i ...

  7. vs使用未初始化的内存怎么解决_遇到C语言内存错误怎么办?一定要找准这六个原因...

    一.没有为指针分配内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存.浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.结构体成员指针未初始化 struct student ...

  8. 【Elasticsearch】es 集群健康值 红色 red 分片 未分配

    1.概述 转载:https://zhuanlan.zhihu.com/p/101608973 转载这篇文章是因为根据我的文章 [Elasticsearch]elasticsearch 7.x 查看分片 ...

  9. 不能返回函数内部new分配的内存的引用_JNI开发之局部引用、全局引用和弱全局引用(三)...

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景 ...

  10. 【C进阶】之动态内存分配及内存操作函数

    动态内存分配及内存操作函数 1 动态内存分配的介绍 2 malloc和free函数 3 测试代码 4 goto的使用场合,常用于出错处理 5 memset() 6 memcpy() 7 memcmp( ...

最新文章

  1. DL之ShuffleNet:ShuffleNet算法的架构详解
  2. Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences
  3. ​稳健、可靠全真即时通信网的架构与应用
  4. schema约束文档与xml文件详解
  5. lambdas for_Java 8发布了! — Lambdas教程
  6. 《游戏设计师修炼之道:数据驱动的游戏设计》一3.8小结
  7. python程序设计知识点汇总_Python入门知识点汇总
  8. 羽毛球 vs. 软件开发
  9. 1 各种Linux系统下载镜像站(系统)
  10. 破解还原卡的方法总结
  11. 抖音、快手无水印视频下载【现已支持所有平台】
  12. MySQL常用SQL语句大全
  13. SQLSTATE[23000]: Integrity constraint violation:1062 Duplicate entry1664187678631531497821000‘ 解决办法
  14. 【转】十大顶级奢侈品服装品牌
  15. 进行拨测的主要目的都有哪些?
  16. JAVA一些基础概念
  17. unity3d实现像素游戏的精确碰撞判定
  18. Kaggle比赛整理
  19. Java8常用循环遍历操作方式的效率对比
  20. VA虚拟应用匠心独妙,细节的精彩

热门文章

  1. 高可用MySQL:构建健壮的数据中心
  2. 成功演示六要素之三——具体
  3. 深度学习:循环神经网络RNN的变体
  4. php for of,JavaScript中 for、for in、for of、forEach的用法小结(附代码)
  5. 蓝桥杯2017年第八届C/C++省赛C组第一题-贪吃蛇长度
  6. AndroidStudio 文件目录如何“刷新”
  7. No pubspec.yaml file found. This command should be run from the root of your Flutter project. Do not
  8. ubuntu搭建简单http服务器
  9. environment variable is too large 2047
  10. 32. My Experiences in the Factories 我在工厂的经历