C 数组如何存储在内存中?

C 数组如何存储在内存中?,c,arrays,pointers,stack,heap,C,Arrays,Pointers,Stack,Heap,我有一个简单的程序,它将数组初始化为: int a[]={10,20,30,40,50}; char *p; p=(char*)a; 现在我想通过指针p访问每个字节的值。为此,我需要知道数组如何存储在内存中(堆栈或堆)?数组将其元素存储在连续的内存位置。 如果在本地创建数组,它将位于堆栈上。存储元件的位置取决于存储规范 例如: 全局或静态声明的数组与本地声明的数组具有不同的存储规范。从技术上讲,where部分是实现定义的,但通常实现会使用类似的使用模式 本地数组将(通常)在堆栈上创建 将

我有一个简单的程序,它将数组初始化为:

int a[]={10,20,30,40,50};

char *p;

p=(char*)a;

现在我想通过指针
p
访问每个字节的值。为此,我需要知道数组如何存储在内存中(堆栈或堆)?

数组将其元素存储在连续的内存位置。
如果在本地创建数组,它将位于堆栈上。存储元件的位置取决于存储规范
例如:
全局或静态声明的数组与本地声明的数组具有不同的存储规范。从技术上讲,where部分是实现定义的,但通常实现会使用类似的使用模式

  • 本地数组将(通常)在堆栈上创建
  • 将(通常)在bss/数据段上创建全局或静态数组,并且
  • 动态创建的数组将在堆上创建
静态创建的数组将位于堆栈上或二进制文件的
.data
/
.bss
部分。将在堆上分配动态创建的数组(使用
new
malloc
)。

首先,指针必须是int类型。 数组只是一组整数,作为单个整数保存在内存中,但保存在一行中。 整数在内存中有4个字节,因此可以通过将指针增加4来访问数组的每个值

int *p = (int*)a;
for(i = 0; i < 5; i++) {
    p += 4;
    printf("%d ", *p);
}
int*p=(int*)a;
对于(i=0;i<5;i++){
p+=4;
printf(“%d”,*p);
}

由于我还不能添加评论,下面是我的两分钱的答案:

如果你只想知道内存是在堆栈上还是在堆上,请阅读其他答案,他们比我更了解情况

如果您想知道值的确切位置,可以随时打印地址:

printf("address at a[0] = %p\n", (void *)&a[0]);
printf("address at p[0] = %p\n", (void *)&p[0]);
你会注意到同样的答案。但是,再看看

printf("address at a[1] = %p\n", (void *)&a[1]);
printf("address at p[1] = %p\n", (void *)&p[1]);
这是一个有趣的小运动。 为了好玩,运行以下代码,看看您得到了什么:

 p[2] = 'a';
 printf("a[0] is %d\n", a[0]);
 printf("a[1] is %d\n", a[1]);
 printf("p[2] is %d\n", p[2]);
 putchar(p[2]);

也许我遗漏了什么,但为什么您需要知道它是存储在堆栈中还是堆中?你试过p[0]吗?也许你可以问一个问题,说你遇到了什么问题,这样我们就有了一个起点……正如@Ray所说,根据你正在做的事情,它可能“无关紧要”……并且可能以各种方式依赖于编译器,由你能做的操作而不是实现细节来定义。无论哪种方式,这些并不是唯一的两类存储……至少在C++中(注意到这是一个C问题,我对C的形式化知之甚少……其他人可能有更合适的链接。)这可能是有用的:“这类问题实际上是C的全部”——不,不是。“为什么需要知道它是存储在堆栈中还是存储在堆上?”——没有这样的需要。问题似乎是关于字节顺序的。@som,为什么要访问int数组的字节?您将获得的字节数是sizeof(a)*sizeof(int),它们的顺序取决于机器架构。+1表示您是SO新手,建议进行实验,这是探索和研究的好方法。不过,我们应该始终记住编译器是不同的。所以,仅仅因为你在实验中观察到一种模式并不意味着它是“真理”。唯一的“真相”是规范的措辞,它提供了一些保证……但除了编译器错误之外,规范仍然严重依赖于“未定义行为”这一支柱。另外,成语是“二分”(如金钱)……不是“二分”,尽管这很有趣。:)@霍斯蒂尔福克,你的观点很好。作为一名新程序员,我决定,既然谷歌似乎总是给我指明方向,那么我可能应该加入!很好地抓住了“美分”!因为OP说他/她想访问每个字节,并且显式使用了char*指针和char*强制转换,所以说指针必须是int类型是没有意义的。此外,int不一定是4个字节,在指针上加4是非常错误的,因为加数乘以int的大小。