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

场景:

1. 这里总结一些日常的容易犯错的细节.

问题1:一个类A有成员变量int deleted,给定一个A的对象指针 *a, 判断deleted为真的时候输出一个语句.

一般情况下新手会这样写:

if(a)
{
	if(a->deleted)
       {
           cout << "deleted" << endl;
       }
}

但这样其实不够精简和浪费行数, 应该这样.

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指针类型的大小决定递增的倍数.

#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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 14:03:05

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

javascript sort方法容易犯错的地方

sort方法用来对数组排序非常方便.但是sort(func)这个func参数的构造却很容易混淆. 这个func的作用是,把排序结果里任意相邻两项a,b放入到func里来执行,如果返回值都为-1,则为正序排列,如返回值都为1,则为逆序排列. 例如,[1,3,65,97,45,6,2] 如果要正序,就应该写成[1,3,65,97,45,6,2].sort(function(a, b){return a - b;}), 如果要逆序:[1,3,65,97,45,6,2].sort(function(a,

作用域--高手都容易犯错的地方

在js中,我们都知道,this的指向是由它被调用时的上下文所决定的.例如: window.id = 888; var data = { id : 999, getId : function(){ console.log(this.id) } } data.getId(); // 999; var getId = data.getId; getId(); // 888 当我们在data上调用getId方法时,this显然是指向data对象的.这个很好理解,我们需要注意的是,当我们把data上的ge

[libcurl]_[初级]_[使用libcurl下载大文件]

场景: 1. 在Windows编程时, 下载http页面(html,xml)可以使用winhttp库,但是并不是很下载文件,因为会失败. 由此引出了WinINet库,无奈这个库的稳定性比较低,使用例子又少, 下载大文件时经常是不完整,可查找的资料很少或者是没有特殊情况的解决办法. 2. 我的原则是如果系统有自带的就用系统的,但是 WinINet 要掌握需要花不少时间. 时间因素考虑到了libcurl. 3. libcurl支持ftp,http等协议的文件读取,还能自动获取文件大小, 最重要的是不

[Cocoa]_[初级]_[NSTableView--数据操作和表格操作要注意的问题]

1.首先在MainMenu.lib文件里面创建一个NSTableView,在界面上显示一个表格出来,并对表格进行设置. 2.创建文件TableViewDelegate.h和TableViewDelegate.m(文件内容如下文件所示).并在MainMenu.lib文件中创建一个Object(从窗口右边选中Object,拉到在Window中的对话框中),命名:TableViewDelegate. 3.设置代理:tableView 进行设置,和图片中的Table View进行连接. staticFi

[Java]_[初级]_[String的split里的坑]

场景: 1. 有时候需要使用某些字符来作为值的合并存储,比如以@作为分隔符, [email protected]@323232, 用一个属性存储这3个值, 用的时候再拿出来split就可以了. 2. 问题是有时候某个值会缺失,比如第一个值没有的情况, @[email protected]  第2,3个值没有的情况 [email protected]@ ,当然也期望是能返回3个值,只是后边2个值为空字符就行了. 事实上,结果不是这样,即使 2,3个值没有的情况 [email protected]@

[Windows]_[初级]_[创建独立子进程和读取子进程的输出]

场景: 1.  有一些外部工具命令需要通过程序调用,比如启动服务器或者使用网络命令获取输出. 2.  使用了匿名管道CreatePipe获取子进程输出. 参考: 1.  MSDN的主题<Creating a Child Process with Redirected Input and Output>. 2.  <Windows核心编程>进程章节. 代码: #include "test_shellrun.h" #include <stdlib.h>

[ATL/WTL]_[初级]_[拖放文件到窗口]

场景: 1. 软件需要支持从桌面拖动文件到软件里,避免从文件打开窗口选择文件,这样效率快很多,这时就需要窗口支持拖放技术. drag and drop. 2. 软件需要复制文件到远程或设备里,支持拖放的话就很方便. 两种方案: 1. 如果是Windows 窗口程序, 可以使用监听WM_DROPFILES 消息来实现, 这里讲解第一种, 比较方便. http://blog.csdn.net/laogaoav/article/details/9152181 2. 如果不想监听 WM_DROPFILE

[WTL/ATL]_[初级]_[如何使用GetOpenFileName多选文件-根据文件名长度计算lpstrFile长度]

场景: 1. 使用GetOpenFileName 时, 需要预先自定义lpstrFile的长度比如,buf[1024], 但是如果选择的文件过多怎么办?总不能创建一个超大的内存空间吧, 如果选择少时又浪费内存. 2. 微软的MSDN的坏处就是不提供实际的例子,而在别的地方提供,难道他们没遇到这类普通的问题? 3. 这里stackoverflow提供了一个微软使用lpfnHook 的例子来解决这个问题,这个例子对于unicode是有问题的,计算长度没有x2. 这个bug困扰了我半天. 找这个解决方

[C/C++标准库]_[初级]_[使用fstream合并文本文件]

场景: 1. 就是合并文本文件,并且从第2个文件起不要合并第一行. 2. 多加了一个功能,就是支持2个以上的文件合并. 3. 问题: http://ask.csdn.net/questions/192151 只能说很简单: 基础不过关吧,这位同学,也有可能不是开发的,放这里也是为了培训基础差的. test.cpp #include <fstream> #include <string> #include <iostream> using namespace std; /