关于 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]
相当于*a
,a[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-a
是 0
,但 a+a
无效。)
假设我有以下代码:
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]
相当于*a
,a[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-a
是 0
,但 a+a
无效。)