我有一个简单的程序,它将一个数组初始化为:
int a[]={10,20,30,40,50};
char *p;
p=(char*)a;
现在我想通过指针p
访问每个字节的值。为此,我需要知道:数组是如何存储在内存中的?它是存储在堆栈还是堆中?
我有一个简单的程序,它将一个数组初始化为:
int a[]={10,20,30,40,50};
char *p;
p=(char*)a;
现在我想通过指针p
访问每个字节的值。为此,我需要知道:数组是如何存储在内存中的?它是存储在堆栈还是堆中?
数组将其元素存储在连续的内存位置中。
如果您在本地创建了数组,则它将位于堆栈上。元素存储的位置取决于存储说明。
例如:
全局或静态声明的数组与本地声明的数组具有不同的存储说明。从技术上讲,where部分是实现定义的,但通常实现会使用类似的用法模式。
由于我目前还不能添加评论,以下是我的建议:
如果您只想知道内存是在堆栈上还是在堆上,那么请阅读其他答案,它们比我更了解。
如果您想确切地知道值的位置,您可以打印地址:
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]);
静态创建的数组会放在栈上或二进制文件的 .data
/.bss
段中。动态创建的数组(使用 new
或 malloc
)将被分配在堆上。
首先,您的指针必须是 int 类型。 数组只是一组整数,在内存中保存为单个整数,但在一行中。 一个整数在内存中有 4 字节,因此您可以通过将指针增加 4 来访问数组的每个值。
int *p = (int*)a;
for(i = 0; i < 5; i++) {
p += 4;
printf("%d ", *p);
}