2012-04-01 44 views
3

我想要使用下面的代码获取LPTSTR变量和CONST CHAR变量的大小,但我无法获得正确的大小。获取包含十六进制值的LPTSTR或CHAR *的大小

我应该得到20,但我得到0为const char *变量和4为LPTSTR变量。

const char *var1 = "\x00\x00\x00\x00" 
        "\x00\x00\x00\x00" 
        "\x02\x00\x00\x00" 
        "\x5B\xE0\x5B\xE0" 
        "\x00\x00\x00\x00"; 

LPTSTR var2 =  "\x00\x00\x00\x00" 
        "\x00\x00\x00\x00" 
        "\x02\x00\x00\x00" 
        "\x5B\xE0\x5B\xE0" 
        "\x00\x00\x00\x00"; 

printf("%d", sizeof(var1)); // this outputs 0 
printf("%d", sizeof(var2)); // this outputs 4 

我需要的价值的大小,将其插入到Windows注册表使用下面的函数的二进制数据(REG_BINARY):

lRes = RegSetValueEx(hMykey, "Scancode Map", 0, REG_BINARY, (LPBYTE) var2, sizeof(var2)); 
+1

第一次如何得到0?看起来不正确。 – cnicutar 2012-04-01 22:13:50

+0

对不起,我得到4 sizeof(var1) – hardyRocks 2012-04-01 22:22:05

回答

3

var1的类型是const char*,并且var2的大小是LPTSTR(这是您的情况是的别名)。 sizeof var1相当于sizeof (const char*),而不是它指向的字符数组的大小。在你的平台上,sizeof (char*)是4个字节。

你,而不是可以这样做:

const char var1[] = { 0x00, 0x00, ..., 0x00 }; 

然后sizeof var1将相当于sizeof (const char[20]),这是你想要的。

+0

是的,我现在可以得到尺寸。谢谢。 – hardyRocks 2012-04-01 22:36:10

+0

但是如何用const char * value初始化const char var1 [],我通过函数参数? – hardyRocks 2012-04-01 22:40:59

+0

@hardyRocks:如果你通过函数参数获取它,调用者将需要传递大小。 – jamesdlin 2012-04-02 01:06:07

0

你需要做的

const char var1[20] = "\x00\x00\x00\x00" 
       "\x00\x00\x00\x00" 
       "\x02\x00\x00\x00" 
       "\x5B\xE0\x5B\xE0" 
       "\x00\x00\x00\x00"; 
+0

是的,但价值将是动态的,它可能会有所不同。 – hardyRocks 2012-04-01 22:26:04

+0

你可以做什么@jamesdlin建议。但是如果这些值是动态的,也许你应该动态分配你的内存。 – Griffin 2012-04-01 22:30:40

+1

@hardyRocks:如果数组大小是动态的,那么您需要动态分配内存,并且需要自己跟踪大小。 – jamesdlin 2012-04-01 22:33:46

0

备选:

#define STR "\x00\x00\x00\x00" \ 
      "\x00\x00\x00\x00" \ 
      "\x02\x00\x00\x00" \ 
      "\x5B\xE0\x5B\xE0" \ 
      "\x00\x00\x00\x00" 
const char * var1 = STR; 

printf("%d\n", sizeof(STR)-1); 

不知道什么是这些变量的目的,但你也可以做

LRES =函数RegSetValueEx(hMykey, “扫描码图”,0,REG_BINARY,(LPBYTE) STR,sizeof(STR)-1);

直接。

+0

这个值是动态的,实际上它会每次通过一个函数的参数多次以不同的值发送。所以我无法定义这个值。该函数将调用RegSetValueEx函数的传递值和值的大小。 – hardyRocks 2012-04-02 08:49:27

+0

如果是这种情况,则需要将大小作为额外参数发送,或将大小作为数据的一部分嵌入。由于您拥有的只是一个指向数据的指针,因此无法从指针中推断出您指向的数据的“大小”。 – pizza 2012-04-02 09:23:43

+0

根据MS提供的信息。 typedef CHAR * LPSTR; LPSTR一个指向8位Windows(ANSI)字符的以空字符结尾的字符串的指针。 有关更多信息,请参阅字体使用的字符集。 LPTSTR如果定义了UNICODE,则为LPWSTR,否则为LPSTR。 #ifdef UNICODE typedef LPWSTR LPTSTR; #else typedef LPSTR LPTSTR; #endif 因此,这些字符串假设为空终止,也就是说数据本身 不包含二进制0,但终止字节为0.但在您给出的示例 中,嵌入了二进制0? – pizza 2012-04-02 09:37:10

相关问题