[持续更新] 编程札礼

    写这篇文章的起因是 参加了一个公司的笔试 发现考的都是很细节的东西 所以在学习中遇到这样的问题就记录一下.
    1.指针在申请/释放后置NULL 防止野指针;
    2. delete一个不是new出来的地址会导致堆破坏;
    3.WIN7上系统自带程序 入regedit或calc taskmgr 弹出错误对话框的函数是DialogBoxIndrectParamW;
    4.务必检测内存分布失败情况malloc ExAlloc
    5.() > [] > *
    例子:
    int *a[10];[] > * 所以是数组 什么类型的数组 *指针 即指针数组
    int (*a)[10]; () > [] 所以是指针 什么类型是指针 [10]数组 级数组指针;
    int (*a[10])(int); []>*为数组 类型是指针数组 后面还加函数 即函数指针数组
    6:字符数组如果不是用花括号初始化的sizeof这个数组为字符个数+1 反之不加(即用花括号初始化的sizeof为元素个数)
    7:strlen计算字符串有效字符数不包含 在申请时需要+1
    8:数组做函数参数时,在函数体内计算该数组参数等同于计算指针的长度 在32位下指针长度为4 64位下为8
    这种情况是算指针的长度int *a = new int[50]; sizeof(a) = 4;
    9:计算数组长度时,如果函数作为函数的参数,将退化为指针,其长度为指针的长度 这个同8
    例子:

    10:数组名和取数组地址是一样的 但两个含义不同
    比如int a[2]
    a为int类型 &a为a[2]的类型
    在a+1 &a+1时 一个是地址+4 一个是地址+整个数组的大小
    不比如:int a[5][10]
    a是 int a[10]类型 &a是a[5][10]类型(a总是最后一个下标的类型(如果不是多维数组为类型的类型如上))
    抽象的说 如果定义一个数组 int a[M1][M2][M3][…][Mn]
    那么a+1 = a的首地址 + m2*m3*m4*…*Mn*sizeof(int);
    那么&a+1 = a的首地址 + m1*m2*m3*m4*…*Mn*sizeof(int);

    11.得到结构体中某个数据的偏移 可以这么做 将0强制转换成结构指针 然后获取成员指针 然后转换成size_t就是偏移了
    定义这么一个宏

    12.与(&)运算 取位操作例如一个数&1的结果就是取最末位,这可以用来判断一个整数的奇偶 如果末位为0则偶反正为奇
    两个都是1时为1 反则为0;

    13.或(|)用于二进制特定位上的无条件赋值 列入一个数 | 1 的结果就是把二进制最末位强行变成1
    如果要将最末位置0 对这个数 | 1之后 再减1就可以了
    14.异或 ^ 相同为假,不同为真 也是逆运算

    15.取反~ 运算 对一个无符号整数(不能表示负数)值取反 得到的是它与该类型上界的差

    16.左移

    17.右移>> a >> b表示把二进制a 右移 b位(去掉末b位) 相当于a处于2的b次方(取整)

    18.指针末尾
    已知首地址 求末地址
    pStare
    pEnd = pStare + N -1

    pEnd = pStare + strlen(str) – 1;

    19.用户态传进来的东西严格检查并要自己复制一份!
    20.内核不要使用递归!内核不要使用递归!内核不要使用递归!(虽然微软自己使用了递归InternalBuildHwndList)
    21.内核字符串局部变量最好不要用数组定义!比如WCHAR[MAX_PATH]!内核栈太小啦!

来源:zhuhuibeishadiao

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年2月28日
下一篇 2016年2月28日

相关推荐