【问题标题】:Pointer arithmetics in C++ uses sizeof(type) incremention instead of byte incremention?C++ 中的指针算法使用 sizeof(type) 增量而不是字节增量?
【发布时间】:2012-06-14 16:34:18
【问题描述】:

我对 C++ 中指针运算的行为感到困惑。我有一个数组,我想从当前数组向前移动 N 个元素。由于在 C++ 中指针是 BYTES 中的内存地址,因此对我来说代码是 newaddr = curaddr + N * sizeof(mytype) 似乎是合乎逻辑的。但是它产生了错误;后来我发现newaddr = curaddr + N 一切正常。为什么这样?真的应该是address + N而不是address + N * sizeof吗?

我注意到的部分代码(所有内存分配为一个块的二维数组):

// creating pointers to the beginning of each line
if((Content = (int **)malloc(_Height * sizeof(int *))) != NULL)
{
    // allocating a single memory chunk for the whole array
    if((Content[0] = (int *)malloc(_Width * _Height * sizeof(int))) != NULL)
    {
        // setting up line pointers' values
        int * LineAddress = Content[0];
        int Step = _Width * sizeof(int); // <-- this gives errors, just "_Width" is ok
        for(int i=0; i<_Height; ++i)
        {
            Content[i] = LineAddress; // faster than
            LineAddress += Step;      // Content[i] = Content[0] + i * Step;
        }
        // everything went ok, setting Width and Height values now
        Width = _Width;
        Height = _Height;
        // success
        return 1;
    }
    else
    {
        // insufficient memory available
        // need to delete line pointers
        free(Content);
        return 0;
    }
}
else
{
    // insufficient memory available
    return 0;
}

【问题讨论】:

  • 你检查过语言规范吗?
  • 在那里发现指针有一个内存地址作为字节偏移量(即内存中的第N个字节)。这就是为什么它看起来像一个数字 + 1 = 下一个字节。
  • @fynjyzn - 不,“数字 + 1”不一定是“下一个字节”。仅当“数字”恰好是“字符”(或“无符号字符”)时才会为真。

标签: memory-management pointer-arithmetic


【解决方案1】:

您的推理错误就在这里:“由于 C++ 中的指针是 BYTES 中的内存地址,[...]”。

C/C++ 指针不是以字节为单位的内存地址。当然,它由内存地址表示,但您必须区分指针类型及其表示。操作“+”是为一个类型定义的,而不是它的表示。因此,当它被称为int * 类型时,它尊重这种类型的语义。因此,int * 类型上的 + 1 将使指针前进的字节数与底层 int 类型表示使用的字节数一样多。

您当然可以像这样投射指针:(int)myPointer。现在您有了一个数字类型(而不是指针类型),其中+ 1 将按照您对数字类型的期望工作。请注意,在此转换之后,表示形式保持不变,但类型发生了变化。

【讨论】:

    【解决方案2】:

    “指针”指向一个位置

    当你“增加”时,你想去下一个,相邻的位置。

    问:“下一个”和“相邻”取决于您指向的对象的大小,不是吗?

    问:当你不使用“sizeof()”时,一切正常,对吗?为什么?你认为编译器“在你背后”为你做什么?

    问:如果您添加自己的“sizeof()”,您认为会发生什么?

    ON TOP OF“一切正常”的场景?

    【讨论】:

    • 好的,谢谢。我认为如果指针是内存中的字节数,则向其添加 ONE 将指向下一个字节(并可能产生访问冲突)。
    【解决方案3】:

    指针指向地址,因此将指针 p 递增 N 将指向 p 的第 N 个内存块。

    现在,如果您使用地址而不是指向地址的指针,那么添加 N*sizeof(type) 是合适的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2015-08-03
      • 2018-07-28
      • 2015-10-21
      • 2017-12-21
      • 2013-02-20
      • 1970-01-01
      相关资源
      最近更新 更多