c 深度剖析 5
1,指针没有指向一块合法的区域
1指针没有初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h> #include <string.h> struct aa { char *pa; char c; }ssa,*ssb; void main() { strcpy (ssa.pa, "abc" ); printf ( "%s \n" ,ssa.pa); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h> #include <string.h> #include <stdlib.h> struct aa { char *pa; char c; }ssa,*ssb; void main() { ssb=( struct aa *) malloc ( sizeof ( struct aa)); strcpy (ssb->pa, "ac" ); printf ( "%s \n" ,ssb->pa); } |
ssa 定义时 只给 pa指针分配了内存,内存没有初始化,指针指向的地址是随机的(全局变量自动初始化为0 ,局部变量不初始化,为随机值)。
malloc 只给 ssb 初始化了,没有给 pa初始化。
故访问指针指向的地址时会出现错误。
必须对指针进行初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h> #include <string.h> #include <stdlib.h> struct aa { char *pa; char c; }ssa,*ssb; void main() { ssa.pa= malloc ( sizeof ( char )); strcpy (ssa.pa, "ac" ); printf ( "%s \n" ,ssa.pa); } |
2,没有分配足够的空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <stdio.h> #include <string.h> #include <stdlib.h> struct aa { char *pa; char c; }ssa,*ssb; void main() { printf ( "%d\n" , sizeof ( struct aa)); ssb= malloc ( sizeof ( int )); ssb->c= 'D' ; printf ( "%c \n" ,ssb->c); printf ( "address of ssb ->%d\n" ,ssb); printf ( "address of ssb.pa ->%d\n" ,ssb->pa); printf ( "address of ssb.c ->%d\n" ,&(ssb->c)); } |
书上说的例子好像不太对。
结构体为指针加char 按照4字节对齐需要8字节的空间。
malloc了4个字节的空间,依然可以访问。
书上的例子的错误是结构体内的指针没有初始化,而不是空间分配太小。
但是从规范上来说应该:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h> #include <string.h> #include <stdlib.h> struct aa { char *pa; char c; }ssa,*ssb; void main() { ssb=( struct aa *) malloc ( sizeof ( struct aa)); ssb->c= 'D' ; printf ( "%c \n" ,ssb->c); } |
3.
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h> #include <string.h> #include <stdlib.h> void main() { char *pa= "abcdefg" ; char *pb; pb= malloc ( sizeof ( char )); strcpy (pb,pa); printf ( "%s \n" ,pb); } |
不知道是编译器不符合规范还是其他原因。依旧不会出错。
4 数组越界
1
2
3
4
5
6
7
|
#include <stdio.h> void main() { int pa[3]={1,2,3}; printf ( "%d \n" ,pa[4]); } |
GCC对数组越界不进行任何处理,没有错误警告。
5 内存泄漏
内存要及时 free
6 内存释放
1。free后依然可以通过指针变量访问内存,要将 指针变量 p=NULL
2.在子函数中内部定义了一个数组,函数返回数组的指针。子函数中定义的数组,在函数返回时会自动销毁,返回的指针指向数组的内存,
3,内存使用太复杂,不知道那块已释放,那块未释放。
c 深度剖析 5的更多相关文章
- 《AngularJS深度剖析与最佳实践》简介
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...
- Objective-C类成员变量深度剖析
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...
- 大众点评开源分布式监控平台 CAT 深度剖析
一.CAT介绍 CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解.CAT不仅增强了CAL系统核心模型,还添加了更丰富的报 ...
- 深度剖析WordPress主题结构(转)
利用强大的技术,可以把基于wordpress的网站做成各种各样的形式,这除了要求wordpress主题开发人员精通html,PHP,JS,CSS等技术,还需要开发者掌握WordPress主题的框架. ...
- LCD深度剖析
LCD 深度剖析 来源:http://blog.csdn.net/hardy_2009/article/details/6922900 http://blog.csdn.net/jaylondon/a ...
- WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)
原文:WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话 ...
- 大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网
大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网 大兴雷克萨斯深度剖析2013款LS460L
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
动态代理类原理(示例代码参见java反射机制剖析(三)) a) 理解上面的动态代理示例流程 a) 理解上面的动态代理示例流程 b) 代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...
- 【渗透课程】第二篇下-HTTP协议的请求与响应深度剖析
[渗透课程]第二篇下-HTTP协议的请求与响应深度剖析 HTTP1.1目前支持以下7种请求方法: 常见的MIME类型如下: 第一个数字有五种可能的取值: 目录 什么是请求方法?什么是请求头? HTTP ...
随机推荐
- 【STL】- vector的用法
初始化: 1. 默认构造: vector<int> vint; 2. 用包含10个元素的数组初始化: vector<int> vint(ia, ia+10); 算法: 1. v ...
- Android学习参考教程和工具及常见问题解决
参考教程: 1.菜鸟教程:http://www.runoob.com/w3cnote/android-tutorial-intro.html 2.Android初學特訓班(第五版) 使用工具: 1.A ...
- [vijos P1531] 食物链
做出的第一道NOI题目?(噗,还是看题解才会的…按某篇解题说的,这题就比我年轻四岁…T T 做的第一道IOI题目是USACO上的Packing Rectangles...这题比我还老!)对我等弱渣来说 ...
- OpenCV之响应鼠标(一):利用鼠标获取坐标
好久没有更新博客了,今天临时起意,将以前写的示例代码整理了一下,暂且发布一篇,希望对大家有用! 代码一:点击时显示坐标,鼠标移动时不显示. #include <cv.h> #include ...
- Android基础总结
原文 http://blog.csdn.net/heimady/article/details/10363995 1. 前言 1.1. 什么是 3G . 4G Ÿ 第三代移动通信技术(3rd - G ...
- oracle触发器如何使用2
触发器 是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们.触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处 ...
- php大力力 [015节]兄弟连高洛峰php教程(土豆网栏目地址)
兄弟连高洛峰php教程 兄弟连高洛峰php教程(土豆网栏目地址) [2014]兄弟连高洛峰 PHP教程1.1.1 新版视频形式介绍 [2014]兄弟连高洛峰 PHP教程1.1.2 BS结构软件类型介绍 ...
- javaweb-dbcp
package cn.songxinqiang.samples.commonsdbcp.util; import java.sql.Connection;import java.sql.Databas ...
- R函数是对A方法的封装
$user = new UserController; === $user=A("User"); $user = new UserController; $user-& ...
- 获取本机IP非127.0.0.1
protected function GetiP() { $preg="/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5] ...