操作系统: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为什么把指针作为开辟的空间的首地址,而是把指针作为一个指针变量呢?
如果直接定义成数组为什么就可以呢?求高人回答,谢谢了!

解决方案 »

  1.   

    我记得以前用C开发的时候,malloc返回的指针可以作为内存块的首地址呀,能不能说具体点,谢谢!
      

  2.   

    sizeof 把指针作为开辟的空间很难实现吧比如  TCHAR *Ptchar = X;
    sizeof(Ptchar);Ptchar = XX;
    sizeof(Ptchar); //结果就要变了
      

  3.   

    #define TEXT_LENGTH 50
    把所以50替换成TEXT_LENGTH 
    包含:sizeof(lpWndName1) / sizeof(TCHAR)
      

  4.   

    当然可以作为首地址,但是不代表它可以和数组完全一样,sizeof从来不检测指针指向的内存块真正包含多少内存!从纯粹C语言角度讲,它怎么得到这个尺寸呢?实际上它根本不知道指针真正指向的内存快又多大?
      

  5.   

    如果使用HeapAlloc()倒是有一个HeapSize()
      

  6.   

    char* p;
    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 是两种不同的类型
      

  7.   

    sizeof只是个运算符,返回的结果是参数所占用的内存大小的比特数。
    对于定义Type* p;来说,p是一个指针变量,永远只占有4字节,sizeof(p);运算的结果是p这个变量所占有的空间,也就是p本身所占的4个字节,并不是p所指的内容所占有的空间。
    对于定义Type a[N];来说,a是一个数组名,该数组占有的的空间是N*sizeof(Type)字节,所以sizeof(a);的意思是数组a所占的内存大小。之所以这样定义,是因为数组名是常量,而指针是变量。编译器并不检测指针所指的是什么东西,对于编译器来说,指针只是一个4字节的空间,存放了某个地址。而数组是常量,一旦定义了,它的地址不会发生改变,所以可以方便的计算所占的大小。总之注意一点,sizeof只是个运算符,而不是一个函数。
      

  8.   

    csdn是不是有问题,我才2天没上,结贴率就成80%了,怎么回事?