操作系统:Windows XP
IDE: .NET 2005(VC)
支持UNICODE这是代码:
// TCHAR lpWndName1[50];
TCHAR* lpWndName1 = new TCHAR[50];
wmemset(lpWndName1, 0x0000, 50); switch(uMsg){
case WM_LBUTTONDOWN:
SendMessage(hwnd, WM_GETTEXT,
sizeof(lpWndName1) / sizeof(TCHAR),
(LPARAM)lpWndName1);
// wsprintf(lpWndName1, TEXT("%d"),
// sizeof(lpWndName1) / sizeof(TCHAR));
MessageBox(hwnd, lpWndName1,
lpWndName1, NULL);
break;
case WM_DESTROY:
delete[] lpWndName1;
PostQuitMessage(0);
break;
default:
return
DefWindowProc(hwnd, uMsg, wParam, lParam);
}去掉后面的两个注释,对话框输出的是2,很显然sizeof是把指针的4个字节除以了TCHAR的2个字节得到的。为什么会出现这种
情况?sizeof为什么把指针作为开辟的空间的首地址,而是把指针作为一个指针变量呢?
如果直接定义成数组为什么就可以呢?求高人回答,谢谢了!
IDE: .NET 2005(VC)
支持UNICODE这是代码:
// TCHAR lpWndName1[50];
TCHAR* lpWndName1 = new TCHAR[50];
wmemset(lpWndName1, 0x0000, 50); switch(uMsg){
case WM_LBUTTONDOWN:
SendMessage(hwnd, WM_GETTEXT,
sizeof(lpWndName1) / sizeof(TCHAR),
(LPARAM)lpWndName1);
// wsprintf(lpWndName1, TEXT("%d"),
// sizeof(lpWndName1) / sizeof(TCHAR));
MessageBox(hwnd, lpWndName1,
lpWndName1, NULL);
break;
case WM_DESTROY:
delete[] lpWndName1;
PostQuitMessage(0);
break;
default:
return
DefWindowProc(hwnd, uMsg, wParam, lParam);
}去掉后面的两个注释,对话框输出的是2,很显然sizeof是把指针的4个字节除以了TCHAR的2个字节得到的。为什么会出现这种
情况?sizeof为什么把指针作为开辟的空间的首地址,而是把指针作为一个指针变量呢?
如果直接定义成数组为什么就可以呢?求高人回答,谢谢了!
解决方案 »
- 256色老游戏截图出现花屏
- 哪位给总结一下,DDX_Control、SubClassWindow、SubClassDlgItem、Attach
- 那位高人有在多文档框架下,在一个非莫态对话框中连接的数据库数据,要求要有打印预览,打印属性设置,打印出来的数据是表格形式,的实例,谢谢!!
- 迅雷5的社区互动里面的那个分享、收藏、发布是如何做出来的呢?
- 我想用程序控制选中一个默认的ctreectrl的一个ITEM,请问怎么实现
- 请教kodak扫描控件的用法
- 在文档视图结构中如何得到主帧窗口的指针?
- 急!!!!!!!!!! 在DLL中自己定义的自变量无法赋值 !!!!!!!!!!急
- mdi怎样可以使启动程序时不打开子窗口?
- 请问在用DIRECTSHOW播放MPEG文件时如何设置透明色 ?
- MFC关于调用类成员函数的问题
- 如何判断MFC的MDI程序中的当前子窗体发生改变?
sizeof(Ptchar);Ptchar = XX;
sizeof(Ptchar); //结果就要变了
把所以50替换成TEXT_LENGTH
包含:sizeof(lpWndName1) / sizeof(TCHAR)
char p[20];
char p[21];三种表示法中的变量 p 虽然都是字符指针(或者内存地址),但作为变量,是完全不同的3种变量类型,因为它们的sizeof(p)的值分别是 4/20/21。还有同类型赋值操作的行为也不同,例如
char *p, *p1 = ...;
p = p1; // 这个赋值仅仅把 p1 的指针值传递给了 p,两个指针变量的值是相同的,下面的断言成立。
assert(p==p1);char p[20], p1[20] = "hello world";
p = p1;
assert(p!=p1);
// 这个赋值是把 p1 指向的20个字节内容复制到 p 指向的20个字节内存中
// 但是 p!=p1,因为这种比较仅把 p 和 p1 当作指针看待,它们是不同的指针(而且不可改变)还有一种情况:
char p[20];
char p1[21] = "hello world";
p = p1; // 这个赋值不会通过编译,因为 p 和 p1 是两种不同的类型
对于定义Type* p;来说,p是一个指针变量,永远只占有4字节,sizeof(p);运算的结果是p这个变量所占有的空间,也就是p本身所占的4个字节,并不是p所指的内容所占有的空间。
对于定义Type a[N];来说,a是一个数组名,该数组占有的的空间是N*sizeof(Type)字节,所以sizeof(a);的意思是数组a所占的内存大小。之所以这样定义,是因为数组名是常量,而指针是变量。编译器并不检测指针所指的是什么东西,对于编译器来说,指针只是一个4字节的空间,存放了某个地址。而数组是常量,一旦定义了,它的地址不会发生改变,所以可以方便的计算所占的大小。总之注意一点,sizeof只是个运算符,而不是一个函数。