【发布时间】:2015-10-07 20:27:55
【问题描述】:
我编写了一个 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 这是数组的大小。然后,我认为数组分配内存的下一个内存地址包含数组的大小。但是,双类型数组不会发生这种情况。
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++,因此 ptr 指向数组 a 之外的程序内存中的一个区域。由于您重新编译以从 int 更改为 double 我无法推断为什么在一种情况下您得到 5 而另一种情况下得到零。 double 和 int 都存储为 4 个字节,double 是 IEEE 488 浮点数。
-
@jdweng: 1) 进一步研究未定义的行为是没有用的。 2) double 至少需要 64 位,即 8 个八位字节(除非您的字节有 16 位,这将是完全有效的 - 检查 CHAR_BIT) 3) 什么是 IEEE488?通常 C 使用 IEC 60559(又名 IEEE754)浮点。永远不要标题你提到的标准。能给个链接吗?
-
"它应该是一个垃圾值" -- 它是一个垃圾值。 "但是,每次它都显示 5,这是数组的大小。' --
5是垃圾。垃圾不需要每次都具有不同的值;看起来一致的垃圾仍然是垃圾。垃圾不是(必然)随机的。 -
很可能是跑到
i的低位字节了,刚好在数组后面存入内存,循环后应该是5。 -
我写错了 IEEE 规范。对不起。