首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >局部数组和数组索引变量在内存中是如何存在的?

局部数组和数组索引变量在内存中是如何存在的?
EN

Stack Overflow用户
提问于 2012-08-07 15:10:53
回答 4查看 143关注 0票数 1

我在一次面试中遇到了第一个问题,我想要对这个问题有一个恰当的解释,我在家里试了一下,其他一些困惑也随之增加。

代码语言:javascript
复制
#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之后出现的内存变量中,我得到了这个答案。

但我再一次混淆了这一点

代码语言:javascript
复制
 #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,

再一次更多的混淆如下

代码语言:javascript
复制
#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编译器..

如果编译器特定或架构特定,请在答案中也提到。

EN

回答 4

Stack Overflow用户

发布于 2012-08-07 15:15:31

这称为Undefined Behavior。由于您正在访问超出其边界的数组,因此任何都可能发生,并且结果不一定(也不会)有意义。

票数 1
EN

Stack Overflow用户

发布于 2012-08-07 15:15:54

不应访问越界数组内存。越界数组访问的值可以是任何值-它没有期望值,并且它具有未定义的行为。似乎您期望在数组之后本地创建的char和int变量在内存中位于数组变量之后。即使是这种情况,您也没有初始化这些变量,因此它们的值可以是任何值。简单地说,不要访问超出范围的内存,当然也不要尝试预测访问它的结果。

票数 1
EN

Stack Overflow用户

发布于 2012-08-07 15:19:50

您正在处理的是未定义的行为。

在第一种情况下,i变量恰好放在堆栈上的arr数组之后,因此如果超出数组的界限,您将接触到i变量。iarr的类型相同(int),因此可以将i作为数组的一部分打印出来。

在第二种情况下,您试图访问i,就好像它是一个char变量一样,所以您只获得了它的一部分,即为零。

请记住,编译器可以自由地重新排列堆栈上的变量,因此任何认为i变量应该紧跟在后面的假设(即使它是按该顺序声明的)都是不正确的。

对于编译器来说,arri只是两个独立的局部变量。arr的大小并不保存在内存中的任何地方:arr只是一块带有起始地址的内存。您可以在编译时通过静态sizeof操作符检查它的大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11840948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档