![]() |
1
153
一个静态的二维数组看起来像一个数组数组-它只是在内存中连续地排列。数组和指针不是一回事,但是因为你经常可以互换使用它们,所以有时会让人困惑。不过,编译器会正确地跟踪,这会使所有内容都很好地对齐。您必须小心处理您提到的静态2D数组,因为如果您尝试将一个数组传递给一个接受
在记忆中是这样的:
确切地
但如果你想通过
或
让一切都快乐。 同样的概念延伸到 N -维度数组。不过,在应用程序中利用这种有趣的业务通常只会使您更难理解。所以在外面要小心。 |
![]() |
2
86
答案是基于这样一个想法,即C实际上 2D数组-它有数组的数组。当您申报时:
你在要求
另一个难题是数组总是在内存中连续排列。如果您要求:
那就一直这样:
(4
以及每个
总的来说,你会发现:
|
![]() |
3
29
在内存中等于:
|
![]() |
4
5
在静态分配数组的情况下,“系统”将是编译器。它将像为任何堆栈变量一样保留内存。
编译器总是按照声明的方式来处理类型,除了在Carl给出的示例中,它可以找出可互换的用法。这就是为什么如果将[][]传递给函数,它必须假定它是静态分配的平面,其中**假定为指针到指针。 |
![]() |
5
2
假设我们有
尽管内存布局和访问语义完全不同,但数组访问表达式的C语言语法对于同构和异构2D数组看起来完全相同:
编译器知道
当数组类型为
|
![]() |
6
1
要访问特定的2D数组,请考虑数组声明中的内存映射,如下面的代码所示:
要访问每个元素,只需将感兴趣的数组作为参数传递给函数即可。然后使用offset for column分别访问每个元素。
|
![]() |
ajfbiw.s · 执行objdump时没有堆栈或堆 9 年前 |
![]() |
hagrawal7777 · 堆栈段中的意外内存分配 9 年前 |
|
morowinder · 何时在c#中的堆栈上分配数组? 9 年前 |
![]() |
Awais Chishti · 从堆栈-C中删除多余变量++ 10 年前 |
![]() |
SpikeMF · 内存需求:C中的堆与堆栈++ 10 年前 |
![]() |
Hwangho Kim · 堆栈和堆地址区域在Windows和linux中不同 11 年前 |
![]() |
elyashiv · 为什么编译器只为int保留0x10位? 11 年前 |