n 个大小的 C 数组的第 n 个索引是否包含它的大小?
Does nth index of n sized C array contain size of it?
我编写了一个 C 程序,用于使用指针显示数组的值。这是代码:
#include <stdio.h>
int main()
{
int a[] = {1, 1, 1, 1, 1};
int *ptr = a;
for (int i = 0 ; i < 5; i++)
printf("%d ", *ptr++);
printf("%d", *ptr);
}
循环结束后可以看到,指针保存的是数组外某个值的内存地址。因为它即最后一个输出没有被初始化,所以它应该是一个垃圾值。但是,每次它都显示 5,这是数组的大小。然后,我认为为数组分配的内存的下一个内存地址包含数组的大小。但是,double 类型数组不会发生这种情况。
Output for int array : 1 1 1 1 1 5
Output for double array : 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.000000
谁能解释一下输出结果?
你所做的会调用未定义的行为。
很简单的巧合,可能只是i
的值,打印i
的地址并检查。但要小心,它不会总是那样。只需在程序中声明一个新变量,它可能会发生变化。
在double
的情况下它不起作用,因为数组后面的地址不再匹配i
的地址。这就是我说 小心.
的意思
这只是此地址内存中的一个值。你永远不应该访问不是你分配的内存(在这种情况下你正在访问第 6 个元素,但你只声明了 5 个)。在某些情况下,这可能会导致分段错误。
C 不会在任何地方存储任何数组元数据(包括数组长度),无论是在数组的开头还是结尾。在整数数组的情况下,最有可能 对输出的解释是变量 i
使用的内存紧跟在数组的最后一个元素之后,如下所示:
+---+
a: | 1 | a[0]
+---+
| 1 | a[1]
+---+
| 1 | a[2]
+---+
| 1 | a[3]
+---+
| 1 | a[4]
+---+
i: | 5 | a[5]
+---+
但是,您不能依赖此行为的一致性,正如您在将数组类型更改为 double
时看到的那样。
尝试读取数组末尾第一个元素中包含的值会导致未定义的行为。 Chapter and (truncated) verse:
6.5.6 Additive operators
...
8 When an expression that has integer type is added to or subtracted from a pointer, the
result has the type of the pointer operand...If the result points one past the last element of the array object, it
shall not be used as the operand of a unary *
operator that is evaluated.
傻笑,我在工作时在我的系统上编译了你的代码,得到了以下输出:
1 1 1 1 1 0
这实际上只是编译器如何为这个特定程序在内存中布置对象的产物。
我编写了一个 C 程序,用于使用指针显示数组的值。这是代码:
#include <stdio.h>
int main()
{
int a[] = {1, 1, 1, 1, 1};
int *ptr = a;
for (int i = 0 ; i < 5; i++)
printf("%d ", *ptr++);
printf("%d", *ptr);
}
循环结束后可以看到,指针保存的是数组外某个值的内存地址。因为它即最后一个输出没有被初始化,所以它应该是一个垃圾值。但是,每次它都显示 5,这是数组的大小。然后,我认为为数组分配的内存的下一个内存地址包含数组的大小。但是,double 类型数组不会发生这种情况。
Output for int array : 1 1 1 1 1 5
Output for double array : 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.000000
谁能解释一下输出结果?
你所做的会调用未定义的行为。
很简单的巧合,可能只是i
的值,打印i
的地址并检查。但要小心,它不会总是那样。只需在程序中声明一个新变量,它可能会发生变化。
在double
的情况下它不起作用,因为数组后面的地址不再匹配i
的地址。这就是我说 小心.
这只是此地址内存中的一个值。你永远不应该访问不是你分配的内存(在这种情况下你正在访问第 6 个元素,但你只声明了 5 个)。在某些情况下,这可能会导致分段错误。
C 不会在任何地方存储任何数组元数据(包括数组长度),无论是在数组的开头还是结尾。在整数数组的情况下,最有可能 对输出的解释是变量 i
使用的内存紧跟在数组的最后一个元素之后,如下所示:
+---+
a: | 1 | a[0]
+---+
| 1 | a[1]
+---+
| 1 | a[2]
+---+
| 1 | a[3]
+---+
| 1 | a[4]
+---+
i: | 5 | a[5]
+---+
但是,您不能依赖此行为的一致性,正如您在将数组类型更改为 double
时看到的那样。
尝试读取数组末尾第一个元素中包含的值会导致未定义的行为。 Chapter and (truncated) verse:
6.5.6 Additive operators
...
8 When an expression that has integer type is added to or subtracted from a pointer, the result has the type of the pointer operand...If the result points one past the last element of the array object, it shall not be used as the operand of a unary*
operator that is evaluated.
傻笑,我在工作时在我的系统上编译了你的代码,得到了以下输出:
1 1 1 1 1 0
这实际上只是编译器如何为这个特定程序在内存中布置对象的产物。