3

我正在阅读一些代码,我遇到了这个例子。我不明白为什么作者在最后一行使用两个变量的偏移量 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;
}

最后一行是有问题的。为什么他这样做是必要的,这是否合法,何时应该这样做?

4

3 回答 3

1

看来作者只是想使用当前的全局语言环境比较两个字符。

由于std::collate<T>::compare对两个范围使用 [low, high),将 1 添加到参数的地址只会导致仅在 a 与 b 进行比较后停止比较。不应该有无效的内存访问。

于 2013-08-01T02:40:19.650 回答
0

你在读什么书,另外这也取决于你在比较什么!

有时您需要比较恰好位于缓冲区开头且具有一定大小的 ID。

于 2013-08-01T02:44:51.660 回答
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"

由此我相信

  1. 该代码是合法的
  2. &a + 1指的是可能未初始化的内存

从 gdb 返回的内容来看,我倾向于认为将 awchar_t返回的地址 achar*因此&a( ais a wchar_t) 是 a到多字节变量的开头,char*即返回指向第二个字节的指针。我对么?a&a+1

于 2013-08-01T02:58:07.267 回答