【发布时间】:2015-05-25 03:55:57
【问题描述】:
我在玩 C 中的内存寻址,遇到了一个我无法完全解释的情况。
编辑:代码由 c++ 编译器编译。 (g++)
#include <cstdlib>
#include <cstdio>
int main()
{
int* array[10]; //array of pointers to integers
for(int i = 0; i < 10; i++)
{
array[i] = (int*)malloc(sizeof(int));
*(array[i]) = i;
}
printf("\n");
for(int i = 0; i < 10; i++)
{
printf("%d:%p\n", *(array[i]), array[i]);
}
printf("\n");
int arr[10]; //array of integers
int* start = arr; //pointer to the first element (array decay)
for(int i = 0; i < 10; i++)
arr[i] = i;
printf("\n");
for(int i = 0; i < 10; i++)
{
printf("%d:%p\n", *(start + i), start + i);
}
printf("\n");
return 0;
}
一切都可以编译并且可以工作,但是我得到了奇怪的内存地址。 对于第一个数组,我得到类似:
0:0x23e4010
1:0x23e4030 (32 bits between the addresses which is correct)
但是对于我得到的第二个数组:
0:0x7ffdaf876290
1:0x7ffdaf876294 (only 4 bits? or maybe they are bytes - but why the long addresses???)
有人能解释一下吗? (还有一个函数可以毫不费力地将十六进制转换为十进制吗?)
【问题讨论】:
-
不清楚为什么你会期待你所期待的。因此很难解释它,因为对我们来说它并不像你那样“奇怪”。无论如何,我已经尝试回答了。
-
顺便说一句,请修正你的问题的标题:它一点也不突出。
-
另外,那些
%p打印内存地址,它们是字节而不是位。所以前两个相隔 32 个字节,后两个相隔 4 个字节。 -
Patrick Roberts 您的评论很有道理。但我以 32 字节的差异得到所有这些(也许这就是我的平台分配它们的方式)。
-
是的,这就是每个人的观点。所有这一切都取决于平台,您不应期望或依赖任何特定行为,因为如果您安全且正确地编写程序,它永远不会直接影响您。