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的更多相关文章

  1. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

  2. ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

    从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...

  3. Objective-C类成员变量深度剖析

    目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...

  4. 大众点评开源分布式监控平台 CAT 深度剖析

    一.CAT介绍 CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解.CAT不仅增强了CAL系统核心模型,还添加了更丰富的报 ...

  5. 深度剖析WordPress主题结构(转)

    利用强大的技术,可以把基于wordpress的网站做成各种各样的形式,这除了要求wordpress主题开发人员精通html,PHP,JS,CSS等技术,还需要开发者掌握WordPress主题的框架. ...

  6. LCD深度剖析

    LCD 深度剖析 来源:http://blog.csdn.net/hardy_2009/article/details/6922900 http://blog.csdn.net/jaylondon/a ...

  7. WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)

    原文:WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话 ...

  8. 大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网

    大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网 大兴雷克萨斯深度剖析2013款LS460L

  9. Java反射机制剖析(四)-深度剖析动态代理原理及总结

    动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...

  10. 【渗透课程】第二篇下-HTTP协议的请求与响应深度剖析

    [渗透课程]第二篇下-HTTP协议的请求与响应深度剖析 HTTP1.1目前支持以下7种请求方法: 常见的MIME类型如下: 第一个数字有五种可能的取值: 目录 什么是请求方法?什么是请求头? HTTP ...

随机推荐

  1. IDEA调试javaScript

            谈起JavaScript调试,大家可能想到的就是FireFox下的FireBug,这毫无疑问,FireBug基本已经成为JavaScript开发人员的必备工具.在本文中,将向大家介绍如 ...

  2. Chrome 开发者工具有了设备模拟器

    今天从哥们那里学到了一个小技巧,使用chrome自带的多设备模拟器来调试页面在不同设备下的显示效果. 特地上网查了一下,记录一下. 如果想要在 Chrome 上测试网站在不同设备,不同分辨率的显示情况 ...

  3. IT公司100题-2-设计带min函数的stack

    问题描述: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 要求函数min.push 以及pop 的时间复杂度都是O(1).   双倍空间实现: 保存2个栈,分别是元素和当前最小值 ...

  4. HQL查询及Hibernate对c3p0连接池的支持

    //HQL查询 // auto-import要设置true,如果是false,写HQL时要指定类的全名 //查询全部列 Query query = session.createQuery(" ...

  5. 五大要求让BPM与企业对接

    BPM(即业务流程管理)在中国已经有多年的发展历史,但人们经常提到的还是企业对流程的迫切需要,鲜有人讨论什么样的企业才能实施BPM,或者换句话说BPM的本身对企业有什么要求.不是所有的工作都适合BPM ...

  6. CCNA 6.6

    sh run (show running-config) enable disable login logout exit end  enable password privilege level(g ...

  7. PHP ceil() 函数

    定义和用法 ceil() 函数向上舍入为最接近的整数. 语法 ceil(x) 参数 描述 x 必需.一个数. 说明 返回不小于 x 的下一个整数,x 如果有小数部分则进一位.ceil() 返回的类型仍 ...

  8. 知道创宇CTO杨冀龙:网络安全人才决定行业格局

    去年的时候,我曾经在团队内部分享了一个“网络安全人才迁徙图”,被圈子里的同行广为传播.几乎所有行业的安全人士都表示:国内网络安全行业人才资源情况并不乐观——有着10年以上网络安全行业经验的核心安全人才 ...

  9. 功率与dbm的对照表

     功率与dbm的对照表 分类: 嵌入式 功率与dbm的对照表 对于无线工程师来说更常用分贝dBm这个单位,dBm单位表示相对于1毫瓦的分贝数,dBm和W之间的关系是:dBm=10*lg(mW)1w的功 ...

  10. mysql存储过程笔记

    http://blog.csdn.net/wangchao0605/article/details/5935988 基本语法 创建存储过程 create procedure sp_name()begi ...