10 个内存引发的大坑,你能躲开几个?(1)
2012 年 4 月 2 日
int sum(int* arr, int len) { int sum = 0; for (int i = 0; i 这段代码本意是想计算给定数组的和,但上述代码并没有理解指针运算的本意。 指针运算中的加1并不是说移动一个字节而是移动一个单位, 指针指向的数据结构大小就是一个单位 。因此,如果指针指向的数据类型是 int,那么指针加 1 则移动 4 个字节(32位),如果指针指向的是结构体,该结构体的大小为 1024 字节,那么指针加 1 其实是移动 1024 字节。从这里我们可以看出, 移动指针时我们根本不需要关心指针指向的数据类型的大小 ,因此上述代码简单的将arr += sizeof(int)改为arr++即可。
解引用有问题的指针C语言初学者常会犯一个经典错误,那就是从标准输入中获取键盘数据,代码是这样写的: int a; scanf ( "%d" , a); 很多同学并不知道这样写会有什么问题,因为上述代码有时并不会出现运行时错误。 原来 scanf 会将a的值当做地址来对待,并将从标准输入中获取到的数据写到该地址中。 这时接下来程序的表现就取决于a的值了,而上述代码中局部变量a的值是不确定的,那么这时:
- 如果a的值作为指针指向代码区或者其它不可写区域,操作系统将立刻kill掉该进程,这是最好的情况,这时发现问题还不算很难
- 如果a的值作为指针指向栈区,那么此时恭喜你,其它函数的栈帧已经被破坏掉了,那么程序接下来的行为将脱离掌控,这样的 bug 极难定位
- 如果a的值作为指针指向堆区,那么此时也恭喜你,代码中动态分配的内存已经被你破坏掉了,那么程序接下来的行为同样脱离掌控,这样的bug也极难定位
- - - - - - - - - - 伟 大 的 分 割 线 - - - - - - - - - - - P H P 饭 米 粒 ( p h p f a m i l y ) 由 一 群 靠 谱 的 人 建 立 , 愿 为 P H P e r 带 来 一 些 值 得 细 细 品 味 的 精 神 食 粮 ! 饭 米 粒 只 发 原 创 或 授 权 发 表 的 文 章 , 不 转 载 网 上 的 文 章 所 发 的 文 章 , 均 可 找 到 原 作 者 进 行 沟 通 。 也 希 望 各 位 多 多 打 赏 ( 算 作 稿 费 给 文 章 作 者 ) , 更 希 望 大 家 多 多 投 稿 。 投 稿 请 联 系 : s h e n z h e 1 6 3 @ g m a i l . c o m 本 文 由 码农的荒岛求生 授 权 饭 米 粒 发 布 , 转 载 请 注 明 本 来 源 信 息 和 以 下 的 二 维 码 ( 长 按 可 识 别 二 维 码 关 注 )
![]()
素质三连biubiubiu~
![]()