10 个内存引发的大坑,你能躲开几个?(1)

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的值是不确定的,那么这时:
  1. 如果a的值作为指针指向代码区或者其它不可写区域,操作系统将立刻kill掉该进程,这是最好的情况,这时发现问题还不算很难
  2. 如果a的值作为指针指向栈区,那么此时恭喜你,其它函数的栈帧已经被破坏掉了,那么程序接下来的行为将脱离掌控,这样的 bug 极难定位
  3. 如果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~