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

这实际上只是编译器如何为这个特定程序在内存中布置对象的产物。