c语言汉字编码欢迎光临,C语言深度挖掘1

《C语言深度挖掘1》由会员分享,可在线阅读,更多相关《C语言深度挖掘1(42页珍藏版)》请在人人文库网上搜索。

1、变量的表示与存储问题变量的表示与存储问题 1实用精品课件PPT 是否入门?是否入门? 2实用精品课件PPT 改进改进 3实用精品课件PPT 有错吗? 4实用精品课件PPT 为什么在每个头文件都能见到 5实用精品课件PPT 哪个执行效率高? 6实用精品课件PPT 浮点数的内存表示问题 7实用精品课件PPT 无符号整数与有符号整数 8实用精品课件PPT 可以少传一个参数吗? 9实用精品课件PPT 为什么有时相同有时不同? 12 15 12 12 改成改成char a10; 会输出什么?会输出什么? 10实用精品课件PPT 结构体变量的内存表示 11实用精品课件PPT 联合类型变量的内存表示 12实。

2、用精品课件PPT 实际应用的例子 13实用精品课件PPT 位域 14实用精品课件PPT 应用位域的例子段描述符 15实用精品课件PPT C/C+程序运行时的内存结构 全局变量、用static修饰的局部变量都存储在静态数据区。 程序指令和大部分字面常量都存储在代码区。 大部分函数的形参和局部变量都存储在栈区。 程序中动态分配的内存都存储在堆区。 一小部分函数形参和局部变量存储在CPU寄存器组中。 静态数据区 代码区 栈区 堆区CPU寄存器组 常量数据区 已初始化区 未初始化区 16实用精品课件PPT 变量的生存期 把程序运行时一个变量占有内存空间的时间段称为该变量的 生存期生存期。C+把变量的生。

3、存期分为:静态静态、自动自动和动态动态三种。 静态生存期静态生存期:全局变量都具有静态生存期,它们的内存空间从 程序开始执行时就进行分配,直到程序结束才被收回。 自动生存期自动生存期:局部变量和函数形参一般都具有自动生存期,它 们的内存空间在程序执行到定义它们的复合语句(包括函数体) 时才分配,当定义它们的复合语句执行结束时内存被收回。 动态生存期动态生存期:具有动态生存期的变量的生存时间是由程序员自 由控制的,其内存空间用new操作符分配,用delete回收。 在定义局部变量时,可以为它们加上存储类修饰符auto、 static和register来指出它们的生存期。 定义为static存储类。

4、型的局部变量具有静态生存期,它们也被 存放在静态数据区。 17实用精品课件PPT 关键字volatile的作用 18实用精品课件PPT main函数为空居然也有输出? 19实用精品课件PPT 关键字extern的作用 错了!错了! 20实用精品课件PPT 系统栈与过程调用 局部变量局部变量 var_main 参数参数 arg_A2 = 1 返回地址返回地址 其他信息其他信息 局部变量局部变量 var_A2 参数参数 arg_B2=3 返回地址返回地址 其他信息其他信息 局部变量局部变量 var_A1 局部变量局部变量 var_B2 . 局部变量局部变量 var_B1 . 栈底栈底 栈顶栈顶 参。

5、数参数arg_A1= 2 参数参数 arg_B1=4 func_B 的栈帧的栈帧 func_A 的栈帧的栈帧 main 的栈帧的栈帧 21实用精品课件PPT 有问题吗? 22实用精品课件PPT 有问题吗? 23实用精品课件PPT 输出什么? 24实用精品课件PPT 存储位置是否相同? 25实用精品课件PPT 输出什么? 26实用精品课件PPT 输出什么? 27实用精品课件PPT 常量成了变量? 28实用精品课件PPT 堆内存管理方法初探 int *p1 = (int*) malloc(sizeof(int); char *p2 = (char*) malloc(sizeof(char); fr。

6、ee(p1) ; free(p2); 1000 大大 基地址长度 1000 100 自由内存区表自由内存区表 基地址长度 占用内存区表占用内存区表 29实用精品课件PPT 堆内存管理方法初探 int *p1 = (int*) malloc(sizeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2); 1000 大大 基地址长度 100496 自由内存区表自由内存区表 基地址长度 10004 占用内存区表占用内存区表 30实用精品课件PPT 堆内存管理方法初探 int *p1 = (int*) malloc(s。

7、izeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2); 1000 大大 基地址长度 10046 100B89 自由内存区表自由内存区表 基地址长度 10004 100A1 占用内存区表占用内存区表 100A 最先适配算法 最佳适配算法31实用精品课件PPT 堆内存管理方法初探 int *p1 = (int*) malloc(sizeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2); 1000 大大 基地址长度 1000。

8、10 100B89 自由内存区表自由内存区表 基地址长度 10004 100A1 占用内存区表占用内存区表 100A 堆的紧缩问题 32实用精品课件PPT 堆内存管理方法初探 int *p1 = (int*) malloc(sizeof(int); char *p2 = (char*) malloc(sizeof(char); free(p1) ; free(p2); 1000 大大 基地址长度 1000100 自由内存区表自由内存区表 基地址长度 10004 100A1 占用内存区表占用内存区表 100A 33实用精品课件PPT 使用malloc和free的注意事项 1.刚刚分配的动态内存的。

9、初始值是不确定的 2.不能对同一指针(地址) 连续两次进行free操作 3.不能对指向静态内存区(全局变量)或栈内存区(局部变量) 的指针应用free (但可以对空指针NULL应用free)。 4.对一个指针应用free之后,它的值不会改变,但它指向 了一个无效的内存区,这时称该指针为“悬空指针”。 5.如果没有及时释放某块动态内存,并且将指向它的指针 指向了别处,就会造成“内存泄漏”。 6.执行malloc和free函数有一定的代价,所以对于较小的 变量不应该放在动态内存之中,并且尽量避免频繁地分 配和释放动态内存。 34实用精品课件PPT 使用堆内存时的常见错误 1. 内存分配未成功,却使。

10、用了它。 2. 内存分配虽然成功,但是尚未初始化就引 用它。(误认为初始值为0) 3. 内存分配成功并且已经初始化,但操作越 过了内存的边界。 4. 忘记了释放内存,造成内存泄露。 5. 释放了内存却继续使用它。 35实用精品课件PPT 关于悬空指针 一个指针变量,如果不为NULL且没有指向有效 的内存地址,都称为“悬空指针” 通过悬空指针访问其指向的内存区会使程序产生 不可预知的错误。 如何避免悬空指针: 定义指针变量时坚持对其进行正确的初始化 在用free或delete释放内存之后,应及时将相应 的指针置为NULL 36实用精品课件PPT 悬空指针的例子(一) void somefunci。

11、on() int *p; . *p = 7; . void somefuncion() int *p = NULL; /正确地进行初始化正确地进行初始化 . *p = 7; . 37实用精品课件PPT 悬空指针的例子(二) int main() int *p = NULL; p = (int*)malloc(sizeof(int); *p = 5; free(p); / do something *p = 7; printf(%d, *p); free(p); p = NULL; 38实用精品课件PPT 内存泄漏的例子(一) void MyFunction(int nSize) char* p。

12、= new charnSize; if( !SomeFunc() ) printf(“Error”); return; /using the string pointed by p; delete p; 39实用精品课件PPT 内存泄漏的例子(二) char *TransToEng(const char *inputStr) / 将中文翻译成英文将中文翻译成英文 char *outputStr = (char*) malloc( ); /* 翻译翻译 */ return outputStr; int main() char *chineseStr = 欢迎光临欢迎光临; char *englishStr = TransToEng(欢迎光临欢迎光临); printf(%s, englishStr); 40实用精品课件PPT 如何避免内存泄漏 1. 运行检测法 定义自己的malloc和free函数,或者对new和 delete进行重载,在运行时跟踪记录动态内存 的分配和释放情况 利用专用的检测工具,如BoundsChecker 、 Purify和Performance Monitor 2. 利用复杂的程序设计技术(C+) 智能指针技术 为C+增加垃圾回收机制(可参考C+编程 艺术艺术) 41实用精品课件PPT Thank You 更多精品更多精品 敬请关注!敬请关注!。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值