[C/C++]_[初级]_[编程容易犯错的地方]
来源:互联网 发布:植鞣革皮带 知乎 编辑:程序博客网 时间:2024/05/21 21:49
场景:
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: 520info2: 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: 520info2: 5200x506cc0:0x506cc20x506cc2:0x506cc2
0 0
- [C/C++]_[初级]_[编程容易犯错的地方]
- 编写C程序容易犯错的地方
- [C&C++] 容易犯错的经验之谈
- C++/C之易犯错的地方
- 关于C编程容易忽略的地方
- c语言中函数返回局部变量的指针(一些容易犯错的地方)
- java容易犯错的地方
- [C/C++]_[初级]_[malloc-calloc-new的区别]
- [C/C++]_[初级]_[原子操作]
- java编程中容易犯错的地方之BigInteger
- C#_需要注意的地方
- [Object c]_[初级]_[NSString常用方法的总结]
- [Object C]_[初级]_[NSArray排序]
- [C/C++]_[初级]_[C语言编译过程]
- Java中几个容易犯错的地方
- [Object C]_[初级]_[Object C之内存管理]
- [C/C++]_[初级]_[ 线程pthread学习之互斥锁和条件变量的应用 ]
- [C/C++]_[初级]_[标准字符串std::string 所有函数的用法总结]
- DSST(Accurate Scale Estimation for Robust Visual Tracking 代码解读
- 开发js控件心得----强制重绘
- hadoop 2.6 完全分布式安装过程及记录 (详细版)
- 各类程序员学习路线图
- Hibernate分页查询小结
- [C/C++]_[初级]_[编程容易犯错的地方]
- c语言中宏定义的用法
- CSS样式常用的兼容hack写法
- spring-MVC配置问题
- static关键字的作用
- Tomcat并发数优化总结
- guid 在线生成
- java 汉字转换英文小写工具类
- ehcache 缓存使用