当定义4个矩阵时,我确信它们最终会以相同的顺序存储在内存中,但是......
include <stdio.h>
define ROWCOUNT (3)
define COLUMNCOUNT (4)
int imat[ ROWCOUNT ][ COLUMNCOUNT ];
char cmat[ ROWCOUNT ][ COLUMNCOUNT ];
double dmat[ ROWCOUNT ][ COLUMNCOUNT ];
int rmat[ ROWCOUNT ][ COLUMNCOUNT ];
这是我使用的代码,这是不同矩阵的地址: 在每个矩阵中定位第一个元素
Examining imat: memory at: 1004061c0
Examining cmat: memory at: 1004062a0
Examining dmat: memory at: 100406240
Examining rmat: memory at: 100406200
嗯,我可能只是失明但是对我来说,它们看起来像是按顺序排列的i-r-d-c,而且(甚至颠倒)与定义顺序不同。为什么他们在记忆中的顺序错误?
thx求助:)
答案 0 :(得分:1)
可能的原因是这些数组具有不同的大小(cmat是12字节,dmat可能是96字节),编译器会重新排列它们以适应某些对齐要求。一种常见的技术是首先放置具有最严格对齐要求的对象(整数,双精度),并将具有最低要求的对象(如array-of-char)置于最后。这样,由于填充导致的内存浪费最小化。
但是,为什么你关心内存中不同对象的顺序?如果要强制执行序列,请将它们放在同一个结构中(结构成员必须出现在其声明的序列中)。
答案 1 :(得分:1)
为结构成员完成了有争议的内存分配。在你的情况下,数组是在函数中声明的,因此没有必要为它们分配连续的内存位置。
以下是示例代码:
#include <stdio.h>
#define ROWCOUNT 3
#define COLUMNCOUNT 4
struct test{
int imat[ ROWCOUNT ][ COLUMNCOUNT ];
char cmat[ ROWCOUNT ][ COLUMNCOUNT ];
double dmat[ ROWCOUNT ][ COLUMNCOUNT ];
int rmat[ ROWCOUNT ][ COLUMNCOUNT ];
};
int main(void)
{
struct test obj;
int imat[ ROWCOUNT ][ COLUMNCOUNT ];
char cmat[ ROWCOUNT ][ COLUMNCOUNT ];
double dmat[ ROWCOUNT ][ COLUMNCOUNT ];
int rmat[ ROWCOUNT ][ COLUMNCOUNT ];
printf("\n Main Arrays\n");
printf(" %p\n %p\n %p \n%p\n ", (void*) imat, (void*) cmat, (void*) dmat, (void*) rmat);
printf("\n Structure Arrays\n");
printf(" %p\n %p\n %p\n %p\n ", (void*) obj.imat, (void*) obj.cmat, (void*) obj.dmat, (void*) obj.rmat);
}
希望这有帮助
答案 2 :(得分:0)
在元素的数组和结构的情况下完成连续的内存分配,而不是针对不同的数组和结构。在其他情况下,包括您的,不保证连续的内存分配。
答案 3 :(得分:0)
全局变量的放置取决于您的编译工具和目标环境。通常你不必关心它,并且可以让工具做正确的事。
工具可能有一些控制放置的功能,但不可移植,只有在真正需要时才能使用。
答案 4 :(得分:0)
为什么他们在内存中的顺序错误?
您如何定义哪些订单是正确的,哪些是错的? 编译器可以自由重新排列任何变量声明,一些优化打开它甚至可以完全跳过一个变量。你不应该在给定变量在内存中分配的顺序做出任何假设 - 你不应该需要来做任何。