科锐课堂笔记:2017/3/7 数组续篇
2017-03-07 19:52
316 查看
算法要有穷性,即一个算法能在可知次数内完成。
32位平台只管理模4地址(以4对齐的地址),如果一个数据地址不以4对齐且跨过该模4空间,CPU将取多次拼装而成,造成了额外的开销。
举个例子,比如一个PDOWRD pdwSize指向0x400002地址,那么当获取(*pdwSize)值的时候,CPU(小端)(取0x400000处4字节逻辑右移16位)或上(取0x400004处4字节逻辑左移16位),运算得到的结果就是(*pdwSize)的内容。
找程序BUG:
// 函数开头
short int a[2] = {0};
scanf(“%d”,&a[1]);
printf(“%d”,a[1]); // 显示结果正确
// 函数返回后弹0xC0000005异常。 原因:short int是2字节,在scanf中%d指整型,VC6中是4个字,当赋值给a[1]的时候,多覆盖了2字节,破坏了上一层函数的栈信息,返回将发生异常。解决方法将%d替换成%hd,就不会有溢出了。
数组:
当数组名不当作函数形参时,数组名表示该数组的首地址(是一个常量,不能修改赋值),作为函数形参时表示一个指针地址(是变量,可修改赋值)。
下标运算符计算出地址后有取内容的动作。
VC6小BUG演示:
int main() {
float f;
scanf(“%f”,&f);//发生错误
return 0;
} 原因是VC6的启动函数mainCRTStartup里_cinit函数中完成main函数浮点局部变量的分配,但是VC6版本在编译_cinit时会先检查源码中有无对浮点数的操作(如赋值),如果没有在生成的代码里不会有浮点变量的空间分配,此时就会有BUG。
32位平台只管理模4地址(以4对齐的地址),如果一个数据地址不以4对齐且跨过该模4空间,CPU将取多次拼装而成,造成了额外的开销。
举个例子,比如一个PDOWRD pdwSize指向0x400002地址,那么当获取(*pdwSize)值的时候,CPU(小端)(取0x400000处4字节逻辑右移16位)或上(取0x400004处4字节逻辑左移16位),运算得到的结果就是(*pdwSize)的内容。
找程序BUG:
// 函数开头
short int a[2] = {0};
scanf(“%d”,&a[1]);
printf(“%d”,a[1]); // 显示结果正确
// 函数返回后弹0xC0000005异常。 原因:short int是2字节,在scanf中%d指整型,VC6中是4个字,当赋值给a[1]的时候,多覆盖了2字节,破坏了上一层函数的栈信息,返回将发生异常。解决方法将%d替换成%hd,就不会有溢出了。
数组:
当数组名不当作函数形参时,数组名表示该数组的首地址(是一个常量,不能修改赋值),作为函数形参时表示一个指针地址(是变量,可修改赋值)。
下标运算符计算出地址后有取内容的动作。
VC6小BUG演示:
int main() {
float f;
scanf(“%f”,&f);//发生错误
return 0;
} 原因是VC6的启动函数mainCRTStartup里_cinit函数中完成main函数浮点局部变量的分配,但是VC6版本在编译_cinit时会先检查源码中有无对浮点数的操作(如赋值),如果没有在生成的代码里不会有浮点变量的空间分配,此时就会有BUG。
相关文章推荐
- 科锐课堂笔记:2017/3/6 一维数组与多维数组
- java 第七节课堂笔记(数组)
- c语言(⼆二维数组、字符串数组、多维数组)课堂笔记加作业
- 科锐课堂笔记:2017/3/8 内存结构与变量作用域
- 科锐课堂笔记:2017/3/16 二级指针与函数指针
- 科锐课堂笔记:2017/3/15 数组指针与指针数组
- 堆与栈的解析-以数组为例,解析数组在内存中的分布(JAVA基础-课堂笔记)
- 科锐课堂笔记:2017/3/24 调试版堆信息
- 科锐课堂笔记:2017/2/28 循环相关
- 科锐课堂笔记:2017/2/27 IDE环境使用与switch实现机制
- 科锐课堂笔记:2017/3/20 项目文档和位运算
- 黑马程序员——字符串与数组课堂笔记和练习题
- 课堂笔记——指针、数组、函数
- 课堂笔记——数组与指针
- 科锐课堂笔记:2017/2/22 进制转换与编码
- OC课堂笔记->数组NSArray
- c程序入门课堂笔记(局部变量和字符数组)
- [课堂笔记]三.Java数组
- 科锐课堂笔记:2017/3/13 宏与预处理指令
- 科锐课堂笔记:2017/3/23 共用体与枚举类型