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