从内存地址偏移

时间:2013-08-01 02:33:23

标签: c++

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

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

3 个答案:

答案 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"

从此我相信

  1. 代码合法
  2. &a + 1指的是可能未初始化的内存
  3. 从gdb返回的内容我倾向于认为取wchar_t的地址返回char*因此&aawchar_t)是一个char*到多字节变量的开头a&a+1返回指向第二个字节的指针。我是对的吗?