关于sizeof()和分配的内存[重复]

问题描述 投票:-1回答:4

这个问题在这里已有答案:

说我有以下代码:

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)。

c pointers malloc sizeof
4个回答
2
投票

向指针添加值时,结果指针指向不同的数组元素。在这种情况下,a指向数组索引0,因此a + 1指向数组索引1。

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


1
投票

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

现在a[0]相当于*a,而a[1]相当于*(a+1)

如果你将a的类型更改为double *,那么它将成为指向double数组的指针,应用上述逻辑,你将得到a[0]a[1]之间的距离是一个双倍大小。


1
投票

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.