指针以及malloc

来源:互联网 发布:碳 半导体 知乎 编辑:程序博客网 时间:2024/05/17 07:20
  1. .#include <stdio.h> 
  2.      #include <stdlib.h> 
  3.      void getmemory(char *p) 
  4.      { 
  5.        p=(char *) malloc(100); 
  6.        strcpy(p,"hello world"); 
  7.      } 
  8.      int main( ) 
  9.      { 
  10.        char *str=NULL; 
  11.        getmemory(str); 
  12.        printf("%s/n",str); 
  13.        free(str); 
  14.        return 0; 
  15.       } 
  16. 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险 

view plaincopy to clipboardprint?
  1. unsigned short A = 10; 
  2. printf("~A = %u/n", ~A); 
  3.  
  4. char c=128;  
  5. printf("c=%d/n",c); 
  6.  
  7. 输出多少?并分析过程 
  8. 第一题,~A =0xfffffff5,int值 为-11,但输出的是uint。所以输出4294967285 
  9. 第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128。 
  10. 这两道题都是在考察二进制向intuint转换时的最高位处理。 
  11.  
  12. 分析下面的程序: 
  13. void GetMemory(char **p,int num) 
  14.        *p=(char *)malloc(num); 
  15.      
  16. }         
  17. int main() 
  18.        char *str=NULL; 
  19.      
  20.        GetMemory(&str,100); 
  21.      
  22.        strcpy(str,"hello"); 
  23.      
  24.        free(str); 
  25.      
  26.        if(str!=NULL) 
  27.        { 
  28.            strcpy(str,"world"); 
  29.        }     
  30.          
  31.        printf("/n str is %s",str); 
  32.        getchar(); 
  33. }     
  34. 问输出结果是什么?希望大家能说说原因,先谢谢了 
  35. 输出str is world。 
  36. free 只是释放的str指向的内存空间,它本身的值还是存在的. 
  37. 所以free之后,有一个好的习惯就是将str=NULL. 
  38. 此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的, 
  39. 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。 
  40. 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。 
  41. 当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。。。。。。。。楼上都说过了,最好别这么干。