C-关于sizeof()和分配的内存



说我有以下代码:

int main() {
    char *a = malloc(4 * sizeof(char));
    int b = 0;
    b = (a + 1) - a;
    printf("%dn", b);  // Why does this equal sizeof(char) ?
}

我不太了解b = (a + 1) - a等于sizeof(char)。如果我将其从char*更改为double*,那将是sizeof(double)。

当您向指针添加值时,由此产生的指针指向不同的数组元素。在这种情况下, a指向数组索引0,因此 a + 1点为数组索引1。

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

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

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

如果将a的类型更改为double *,则将其变成指向double数组的指针,应用上述逻辑,您将获得a[0]a[1]之间的距离是一个双重大小。

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

>

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

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

相关内容

  • 没有找到相关文章

最新更新