C语言深度解剖读书笔记(7.国嵌答疑问题)

来源:互联网 发布:天天酷跑软件 编辑:程序博客网 时间:2024/06/01 15:42

转自 http://blog.csdn.net/mbh_1991/article/details/10644935

本节知识点:

1.可以利用这个宏 #define OFFSET(type,number)  (int)(&(((type*)0)->number))  求出结构体中成员的偏移量
2.对于assert的使用是:
可以这样
[cpp] view plaincopy
  1. assert(dst && src);   
也可以这样
[cpp] view plaincopy
  1. assert((NULL != dst) && (NULL != src));   
上面两种方式都行!
3.给一个考指针运算的面试题吧:
[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. void main()  
  4. {  
  5.     int TestArray[5][5] = { {11,12,13,14,15},  
  6.                             {16,17,18,19,20},  
  7.                             {21,22,23,24,25},  
  8.                             {26,27,28,29,30},  
  9.                             {31,32,33,34,35}  
  10.                           };  
  11.     int* p1 = (int*)(&TestArray + 1);  
  12.     int* p2 = (int*)(*(TestArray + 1) + 6);  
  13.   
  14.     printf("Result: %d; %d; %d; %d; %d\n", *(*TestArray), *(*(TestArray + 1)),   
  15.                                            *(*(TestArray + 3) + 3), p1[-8],   
  16.                                            p2[4]);  
  17. }  
自己算算吧,记住一个前提就好,就是在对指针进行运算的时候一定要先弄清这个指针的类型!
4.看看下面的代码,感受下安全编程的重要性:
[cpp] view plaincopy
  1. #include<stdio.h>   
  2.   
  3. int main(int argc, char *argv[])   
  4. {   
  5.     int flag = 0;   
  6.   
  7.     char passwd[10];   
  8.   
  9.     memset(passwd,0,sizeof(passwd));   
  10.   
  11.     strcpy(passwd, argv[1]);   
  12.   
  13.     if(0 == strcmp("LinuxGeek", passwd))   
  14.     {   
  15.         flag = 1;   
  16.     }   
  17.   
  18.     if( flag )   
  19.     {   
  20.         printf("\n Password cracked \n");   
  21.   
  22.     }   
  23.     else   
  24.     {   
  25.         printf("\n Incorrect passwd \n");   
  26.     }   
  27.   
  28.     return 0;   
  29.   
  30. }  
看看上面的代码有没有什么问题?如果把命令行输入的文字当作密码的话,会不会存在问题?答案是会,因为这里面有两个知识点:1.是数组越界   2.是strcpy安全性的问题。
首先如果我输入11个字符且最后一个字符是大于0的话,就惨了,strcpy是要copy到'/0'的。他会一直把这11个字符都copy到passwd数组中,此时数组越界了,最后一个字符就把flag标志位个赋值了,if条件就满足了,密码就被破解了!
所以应该使用安全性更高的strncpy:
[cpp] view plaincopy
  1. strncpy(passwd,argv[1],9);  

0 0
原创粉丝点击