[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
原创粉丝点击