我正在编写一段代码,我使用sizeof("somestring")
作为函数的参数,然后我注意到函数没有返回预期值,所以我去看了相应的asm代码,我找到了一个令人不快的惊喜。有没有人对此有解释(见图)?
我知道有1000多种不同的方法可以做到这一点,我已经实现了另外一种,但我确实想知道这种行为背后的原因。
对于好奇,这是Visual Studio 2008 SP1。
答案 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
。
有一级,strcmp
和wcscmp
。
比你std::string
和std::wstring
提高一级。
您选择的最低级别抽象的“速度”(哈!)由
抵消结果不正确。
由于缺乏类型知识而导致效率低下(宽或窄字符串,您的代码不知道)。
由于缺乏数据知识(大写或小写)而导致效率低下。
不要浪费时间来解决低效低级代码的问题,而是浪费时间去搞清楚低级别工具的令人费解的细节,而是使用更高更安全的抽象级别。
<小时/> 仅仅为了记录,sizeof( "abcd" )
是5.观察窗口可能正如Hans Passant所说,显示指针的大小。但是,我不同意Hans的说法,调试器通常无法知道数组的大小:对于调试构建,它可以知道原始源的任何内容和所有内容,包括需要时的逐字原始源(并且它会逐字显示)原始来源,在上下文中)。所以,那4个是恕我直言,一个或另一个错误。调试器代码中的错误或其设计中的错误。
干杯&amp;第h。,
答案 6 :(得分:2)
Sizeof是一个运算符,其值为size_t,通常是32位平台上的unsigned int。这就是为什么你在调试器中看到它为4的原因。 sizeof运算符也是右值,因此您无法在内存上设置监视点。如果可以,该位置将包含5.字符串的大小加上终结符。