【问题标题】:Regarding sizeof() and allocated memory [duplicate]关于 sizeof() 和分配的内存[重复]
【发布时间】:2019-07-17 19:16:43
【问题描述】:

假设我有以下代码:

int main() {

    char *a = malloc(4 * sizeof(char));
    int b = 0;

    b = (a + 1) - a;

    printf("%d\n", b);  // Why does this equal sizeof(char) ?
}

我真的不明白b = (a + 1) - a 是如何等于sizeof(char) 的。如果我将它从 char* 更改为 double*,那么它将是 sizeof(double)。

【问题讨论】:

  • 在 64 位机器上,a 大于 b 可以容纳的大小。不管anypointer + 1 - anypointer是什么?? :)(例如next address - current = sizeof type
  • " 如果我​​将它从 char* 更改为 double*,那么它将是 sizeof(double)。" - 尝试并报告
  • 我试过了,我仍然得到 1,即使在将 a 转换为 (double*) 所以它是 double * a = (double*)malloc(4*sizeof(double)) 我得到 1。我的教授错了吗?

标签: c pointers malloc sizeof


【解决方案1】:

当您向指针添加值时,生成的指针指向不同的数组元素。在这种情况下,a 指向数组索引 0,所以a + 1 指向数组索引 1。

当你从另一个指针中减去一个指针时,结果是数组索引的差异。因此b 将始终为 1,无论指针的类型如何。将a 更改为double * 类型不会改变结果。

【讨论】:

  • 有趣,我最初测试了一个 char 并得到 1,我认为这意味着它适用于所有其他类型。即使是双精度数,它仍然是 1,但我的教授的回答是 sizeof(type),其中 type 是“a”的任何类型。
  • @JackKelly if 指针指向char *
  • 我尝试将 a 转换为 double*,所以它是 double * a = (double*)malloc(4*sizeof(double)),我仍然得到 1。我不应该得到 sizeof(double) 吗?
  • @JackKelly 不存在。只有当你做了类似b = (uintptr_t)(a + 1) - (uintptr_t)a;
【解决方案2】:

a 是指向char 数组的指针。 a[0] 是数组的第一个元素,a[1] 是数组的第一个元素。 a[0]a[1] 之间的距离是一个字符大小。

现在a[0] 等价于*aa[1] 等价于*(a+1)

如果你把a的类型改成double *,那么它就变成了一个指向double数组的指针,应用上面的逻辑,你会得到a[0]a[1]之间的距离是一个双尺寸。

【讨论】:

    【解决方案3】:

    当您有 2 个相同类型的指针(理想情况下,指向同一数组的元素)时,从较高的指针中减去较低的指针会得到 距离(元素的数量)他们。这是指针算法的一个关键特性。因此,在您的示例中,从 a+1 中减去 a 会得到 1 的结果,因为在所指向的两个地址之间有 1 个元素(无论您使用 char* 还是 double* 指针,结果都是 1)。

    【讨论】:

      【解决方案4】:

      这是简单的算术。表达式(a+1)-a 可以简化为1。如果您首先将其重写为(a-a) + 1,则可以很容易地看到这一点。这等于sizeof (char),因为char 的大小始终为1。

      (请注意,这种推理可能并不总是适用于指针运算。a-a0,但 a+a 无效。)

      【讨论】:

      • 逻辑很吸引人,但也很危险。你可以写 a-a 但不能写 a+a 。因此,与数字/数学的平行并不像人们所期望的那样。 (不争辩你在说什么)
      • Nice!l 真正的问题是 a+n 更像是 a + n*sizeof(a[0]) 即指针 + 是 v 不对称的!
      猜你喜欢
      • 1970-01-01
      • 2015-05-08
      • 2011-03-03
      • 1970-01-01
      • 2013-12-19
      • 2020-08-19
      • 2016-10-08
      • 2012-09-24
      相关资源
      最近更新 更多