您的位置:首页 > 编程语言 > C语言/C++

[C/C++]_[初级]_[编程容易犯错的地方]

2015-09-22 11:01 393 查看
场景:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: