【发布时间】:2011-12-12 05:50:58
【问题描述】:
如果您使用 C,我相信我了解普通变量和指针在内存中的表示方式。
例如,很容易理解,一个指针 Ptr 会有一个地址,它的值将是一个不同的地址,也就是它所指向的内存空间。以下代码:
int main(){
int x = 10;
int *Ptr;
Ptr = &x;
return 0;
}
在内存中会有以下表示:
+---------------------+-------------+---------+
| Variable Name | Address | Value |
+---------------------+-------------+---------+
| x | 3342 | 10 |
+---------------------+-------------+---------+
| Ptr | 5466 | 3342 |
+---------------------+-------------+---------+
但是我发现很难理解数组是如何在内存中表示的。例如代码:
int main(){
int x[5];
x[0]=12;
x[1]=13;
x[2]=14;
printf("%p\n",(void*)x);
printf("%p\n",(void*)&x);
return 0;
}
两次输出相同的地址(为简单起见10568)。意思是 x==&x。然而 *x(或数组表示法中的 x[0])等于 12,*(x+1)(或数组表示法中的 x[1])等于 13,依此类推。这怎么能代表?一种方法可能是:
+---------------------+-------------+----------+----------------------+
| Variable Name | Address | Value | Value IF array |
+---------------------+-------------+----------+----------------------+
| x | 10568 | 10568 | 12 |
+---------------------+-------------+----------+----------------------+
| | 10572 | | 13 |
+---------------------+-------------+----------+----------------------+
| | 10576 | | 14 |
+---------------------+-------------+----------+----------------------+
| | 10580 | | trash |
+---------------------+-------------+----------+----------------------+
| | 10584 | | trash |
+---------------------+-------------+----------+----------------------+
这接近发生的情况,还是完全不成立?
【问题讨论】:
-
出于兴趣,在第一个示例中,您为什么将
x和Ptr地址分开这么远?没有什么可以禁止实现这样做,但通常给定函数的自动变量将全部位于“堆栈”上。 -
这只是为了避免混淆并突出重点。我知道他们通常更接近。
-
我想知道 std::vector 是否相同。我听说在某个时候有一些更新,以保证向量在内存中是连续的,但我仍然想知道内存表示是什么......
标签: c arrays memory-management