我正在阅读一些代码,我遇到了这个例子。我不明白的是作者为什么在最后一行使用两个变量的偏移量为1。乍一看,我认为这是非法的,因为它指的是一个可能未初始化的内存区域(并且它可能导致分段错误)。我的头一直告诉我未定义的行为,但这是真的吗?
static bool lt(wchar_t a, wchar_t b)
{
const std::collate<wchar_t>& coll =
std::use_facet< std::collate<wchar_t> >(std::locale());
return coll.compare(&a, &a+1, &b, &b+1) < 0;
}
最后一行是有问题的一行。为什么他必须这样做,是否合法,何时应该这样做?
答案 0 :(得分:1)
似乎作者只想使用当前的全局区域设置比较两个字符。
由于std::collate<T>::compare
对两个范围使用[low,high],因此将1添加到参数的地址只会导致比较仅在a与b进行比较后停止。应该没有无效的内存访问。
答案 1 :(得分:0)
有时您需要比较恰好位于缓冲区开头且具有特定大小的ID。
答案 2 :(得分:0)
测试你的功能
#include <locale>
static bool lt(wchar_t a, wchar_t b)
{
const std::collate<wchar_t>& coll =
std::use_facet< std::collate<wchar_t> >(std::locale());
return coll.compare(&a, &a+1, &b, &b+1) < 0;
}
int main () {
bool b = lt('a', 'b');
return 0;
}
调试器内部
Breakpoint 1, main () at test.cpp:13
13 bool b = lt('a', 'b');
(gdb) s
lt (a=97 L'a', b=98 L'b') at test.cpp:6
6 std::use_facet< std::collate<wchar_t> >(std::locale());
(gdb) p &a
$1 = 0x7fffffffdddc L"a\001翿\x400885"
(gdb) p &a+1
$2 = 0x7fffffffdde0 L"\001翿\x400885"
从此我相信
&a + 1
指的是可能未初始化的内存 从gdb返回的内容我倾向于认为取wchar_t
的地址返回char*
因此&a
(a
是wchar_t
)是一个char*
到多字节变量的开头a
,&a+1
返回指向第二个字节的指针。我是对的吗?