Regarding sizeof() and allocated memory

时间:2019-02-24 03:10:50

标签: c pointers malloc sizeof

Say I had the following code:

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) ?
}

I don't really understand how b = (a + 1) - a is equal to sizeof(char). If I changed it from char* to say double*, it would then be sizeof(double).

4 个答案:

答案 0 :(得分:2)

When you add a value to a pointer, the resulting pointer points to a different array element. In this case a points to array index 0, so a + 1 points to array index 1.

When you then subtract one pointer from another, the result is the difference in the array indexes. So b will always be 1 regardless of the type of the pointer. Changing a to have type double * won't change the result.

答案 1 :(得分:1)

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

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

如果将a的类型更改为double *,则它变成指向double数组的指针,应用上述逻辑,您将获得{ {1}}和a[0]为两倍大小。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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