visual c ++中的sizeof(“...”)让我不高兴

时间:2011-11-02 21:09:53

标签: c++ visual-c++ sizeof

我正在编写一段代码,我使用sizeof("somestring")作为函数的参数,然后我注意到函数没有返回预期值,所以我去看了相应的asm代码,我找到了一个令人不快的惊喜。有没有人对此有解释(见图)?

Watch window shows sizeof==4, asm 5

我知道有1000多种不同的方法可以做到这一点,我已经实现了另外一种,但我确实想知道这种行为背后的原因。

对于好奇,这是Visual Studio 2008 SP1。

7 个答案:

答案 0 :(得分:11)

值5是正确的。常量包括零终止符字节。观察窗口中4的显示是看起来不正确的。

答案 1 :(得分:7)

字符串文字的类型为“n const char的数组”([lex.string],¶8),其中n是组成字符串的char个数。由于字符串以空值终止,sizeof将返回“正常”字符数加1;监视窗口是错误的,这可能是一个错误(正如@Gene Bushuyev所说,它可能将其解释为指针而不是文字=数组)。

值5嵌入到代码中的事实是正常的,sizeof是编译时运算符。

答案 2 :(得分:6)

每个C-String的末尾都有一个C-String终止符'\ 0',因此“pdfa”实际上是以下的char数组{'p', 'd', 'f', 'a', '\0'},但不会打印\ 0。请改用strlen("pdfa")

答案 3 :(得分:6)

请记住,C字符串包含结尾零\0。五是正确的值。

答案 4 :(得分:4)

嗯,5是sizeof(“PDFA”)的正确值。 4个字符+尾随零。

另外,请记住,“结果不一定与通过添加各个成员的存储要求计算的大小相对应。/ Zp编译器选项和pack pragma会影响成员的对齐边界。”

说到Watch窗口,我认为它只是向您显示指针(const char *)本身的大小。尝试以64位模式重新编译程序,然后检查Watch窗口将显示的内容。如果我是对的,那么你会看到8。

答案 5 :(得分:4)

这里的事情变得错误的原因是你选择了一个太低的抽象级别memcmp

有一级,strcmpwcscmp

比你std::stringstd::wstring提高一级。

您选择的最低级别抽象的“速度”(哈!)由

抵消
  • 结果不正确。

  • 由于缺乏类型知识而导致效率低下(宽或窄字符串,您的代码不知道)。

  • 由于缺乏数据知识(大写或小写)而导致效率低下。

不要浪费时间来解决低效低级代码的问题,而是浪费时间去搞清楚低级别工具的令人费解的细节,而是使用更高更安全的抽象级别。

<小时/> 仅仅为了记录,sizeof( "abcd" )是5.观察窗口可能正如Hans Passant所说,显示指针的大小。但是,我不同意Hans的说法,调试器通常无法知道数组的大小:对于调试构建,它可以知道原始源的任何内容和所有内容,包括需要时的逐字原始源(并且它会逐字显示)原始来源,在上下文中)。所以,那4个是恕我直言,一个或另一个错误。调试器代码中的错误或其设计中的错误。

干杯&amp;第h。,

答案 6 :(得分:2)

Sizeof是一个运算符,其值为size_t,通常是32位平台上的unsigned int。这就是为什么你在调试器中看到它为4的原因。 sizeof运算符也是右值,因此您无法在内存上设置监视点。如果可以,该位置将包含5.字符串的大小加上终结符。