我在一次面试中遇到了第一个问题,我想要对这个问题有一个恰当的解释,我在家里试了一下,其他一些困惑也随之增加。
#include <stdio.h>
int main()
{
int arr[4]={10,20,30,40};
int i;
for(i=0;i<=4;i++)
printf("%d,",arr[i]);
printf("\n");
return 0;
}
OUTPUT
10,20,30,40,4,最后一次输出是4,但是它在数组index.Again之外,我想在数组elements.So之后出现的内存变量中,我得到了这个答案。
但我再一次混淆了这一点
#include <stdio.h>
int main()
{
char arr[4]={10,20,30,40};
int i;
for(i=0;i<=4;i++)
printf("%d,",arr[i]);
printf("\n");
return 0;
}
OUTPUT
10,20,30,40,0,再一次更多的混淆如下
#include <stdio.h>
int main()
{
int arr[4]={10,20,30,40};
char i;
for(i=0;i<=4;i++)
printf("%d,",arr[i]);
printf("\n");
return 0;
}
OUTPUT
10,20,30,40,74743796,有没有人能解释为什么产出会出现这种类型的变化?
我用的是英特尔cpu,Ubuntu操作系统,Gcc编译器..
如果编译器特定或架构特定,请在答案中也提到。
发布于 2012-08-07 15:15:31
这称为Undefined Behavior。由于您正在访问超出其边界的数组,因此任何都可能发生,并且结果不一定(也不会)有意义。
发布于 2012-08-07 15:15:54
不应访问越界数组内存。越界数组访问的值可以是任何值-它没有期望值,并且它具有未定义的行为。似乎您期望在数组之后本地创建的char和int变量在内存中位于数组变量之后。即使是这种情况,您也没有初始化这些变量,因此它们的值可以是任何值。简单地说,不要访问超出范围的内存,当然也不要尝试预测访问它的结果。
发布于 2012-08-07 15:19:50
您正在处理的是未定义的行为。
在第一种情况下,i变量恰好放在堆栈上的arr数组之后,因此如果超出数组的界限,您将接触到i变量。i和arr的类型相同(int),因此可以将i作为数组的一部分打印出来。
在第二种情况下,您试图访问i,就好像它是一个char变量一样,所以您只获得了它的一部分,即为零。
请记住,编译器可以自由地重新排列堆栈上的变量,因此任何认为i变量应该紧跟在后面的假设(即使它是按该顺序声明的)都是不正确的。
对于编译器来说,arr和i只是两个独立的局部变量。arr的大小并不保存在内存中的任何地方:arr只是一块带有起始地址的内存。您可以在编译时通过静态sizeof操作符检查它的大小。
https://stackoverflow.com/questions/11840948
复制相似问题