关于 sizeof() 和分配的内存

Regarding sizeof() and allocated memory

假设我有以下代码:

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

向指针添加值时,生成的指针指向不同的数组元素。在这种情况下 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 个元素(无论您使用 char* 还是使用 char*,结果都是 1 double* 指针)。

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

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