数组如何存储在内存中?

时间:2012-05-22 05:12:31

标签: c

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

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

char *p;

p=(char*)a;

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

4 个答案:

答案 0 :(得分:22)

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

  • 本地数组 将(通常)在 堆栈 上创建,而
  • 全局或静态数组 将(通常)在 bss /数据段 上创建 LI>
  • 将在 上创建 动态创建的阵列

答案 1 :(得分:6)

由于我还不能添加评论,所以这是我的答案中的两分钱:

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

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

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]);

答案 2 :(得分:2)

静态创建的数组将位于堆栈中或二进制文件的.data / .bss部分中。将在堆上分配动态创建的数组(包含newmalloc)。

答案 3 :(得分:-3)

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

int *p = (int*)a;
for(i = 0; i < 5; i++) {
    p += 4;
    printf("%d ", *p);
}
相关问题