12

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

int a[]={10,20,30,40,50};   
char *p;
p=(char*)a;

现在我想通过指针访问每个字节的值p。为此我需要知道:数组是如何存储在内存中的?它是存储在堆栈上还是堆上?

4

4 回答 4

33

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

  • 本地数组将(通常)在堆栈上创建,而
  • 将(通常)在bss/data 段上创建一个全局或静态数组,并且
  • 将在heap上创建一个动态创建的数组
于 2012-05-22T05:14:11.523 回答
7

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

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

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

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]);
于 2012-05-22T05:45:49.247 回答
3

静态创建的数组将在堆栈上或二进制文件的.data/.bss部分中。将在堆上分配一个动态创建的数组(带有newor )。malloc

于 2012-05-22T05:15:15.380 回答
-3

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

int *p = (int*)a;
for(i = 0; i < 5; i++) {
    p += 4;
    printf("%d ", *p);
}
于 2012-05-22T05:17:13.540 回答