[C/C++]_[初级]_[编程容易犯错的地方]
2015-09-22 11:01
393 查看
场景:
1. 这里总结一些日常的容易犯错的细节.
但这样其实不够精简和浪费行数, 如果只是为了处理a->deleted的情况请把两个判断合并在一个if里,占用行少又容易理解.
这样定义的大小只有MAX_PATH的字节,不能存储 MAX_PATH的宽字节.要这样定义才能支持MAX_PATH 个大小的宽字节,以下才是相同的:
输出:
设置最后一位wchar_t为0,防止溢出.
info[MAX_PATH-1] = 0; 等同与*(info+MAX_PATH-1) = 0;
输出:
1. 这里总结一些日常的容易犯错的细节.
问题1:一个类A有成员变量int deleted,给定一个A的对象指针 *a, 判断deleted为真的时候输出一个语句.
一般情况下新手会这样写:if(a) { if(a->deleted) { cout << "deleted" << endl; } }
但这样其实不够精简和浪费行数, 如果只是为了处理a->deleted的情况请把两个判断合并在一个if里,占用行少又容易理解.
if(a && a->deleted) { cout << "deleted" << endl; }
问题2: 创建一个TCHAR*(wchar_t*)的路径字符串.
注意: malloc出来的大小是和数组声明的大小是不一样,你觉得以下存储的路径够大吗?wchar_t* info = (wchar_t*)malloc(MAX_PATH);
这样定义的大小只有MAX_PATH的字节,不能存储 MAX_PATH的宽字节.要这样定义才能支持MAX_PATH 个大小的宽字节,以下才是相同的:
#include <iostream> #include <stdlib.h> using namespace std; int main(int argc, char const *argv[]) { wchar_t* info = (wchar_t*)malloc(sizeof(wchar_t)*MAX_PATH); std::cout << "sizeof(wchar_t)*MAX_PATH: " << sizeof(wchar_t)*MAX_PATH << std::endl; wchar_t info2[MAX_PATH]; std::cout << "info2: " << sizeof(info2) << std::endl; return 0; }
输出:
sizeof(wchar_t)*MAX_PATH: 520 info2: 520
问题3:误以为指针+1就是地址值+1
指针p+n的规则是(char*)p + sizeof(*p)*n ,也即是p指针类型的大小决定递增的倍数,也就是偏移量是 sizeof(*p)*n设置最后一位wchar_t为0,防止溢出.
info[MAX_PATH-1] = 0; 等同与*(info+MAX_PATH-1) = 0;
#include <iostream> #include <stdlib.h> using namespace std; int main(int argc, char const *argv[]) { wchar_t* info = (wchar_t*)malloc(sizeof(wchar_t)*MAX_PATH); std::cout << "sizeof(wchar_t)*MAX_PATH: " << sizeof(wchar_t)*MAX_PATH << std::endl; wchar_t info2[MAX_PATH]; std::cout << "info2: " << sizeof(info2) << std::endl; std::cout << (int*)info << ":" << (int*)(info+1) << std::endl; std::cout << (int*)((char*)(info)+sizeof(*info)*1) << ":" << (int*)(info+1) << std::endl; return 0; }
输出:
sizeof(wchar_t)*MAX_PATH: 520 info2: 520
0x506cc0:0x506cc2
0x506cc2:0x506cc2
相关文章推荐
- VS2010 C++ 操作Excel表格的编程实现
- C++连接access数据库
- C/C++读写Excel表格文件
- 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
- c语言中宏定义的用法
- c++重载原理和实现
- 在vs2005/2010 中出现: error LNK2001: 无法解析的外部符号 __security_cookie现象的处理办法
- LINK2001 编译时_RTC_Shutdown和_RTC_InitBase相关错误的解决方法
- 【C语言】求100~200之间的素数
- c++界面开发
- 对c++模板的总结
- c语言宏定义函数如何调用
- c指针加减值得问题
- C语言数据定义长度 16位、32位、64位
- Item 33:避免隐藏继承来的名称(继承与作用域嵌套) Effective C++笔记
- C++操作HTML TABLE元素
- OC和C语言比较
- c语言算法小练习-20
- c语言算法小练习-19
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区