科锐课堂笔记:2017/3/7 数组续篇

  算法要有穷性,即一个算法能在可知次数内完成。


  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。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值