矩阵定义顺序和内存顺序不一样

时间:2013-10-14 08:02:18

标签: c memory matrix

当定义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求助:)

5 个答案:

答案 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)

  

为什么他们在内存中的顺序错误?

您如何定义哪些订单是正确的,哪些是错的? 编译器可以自由重新排列任何变量声明,一些优化打开它甚至可以完全跳过一个变量。你不应该在给定变量在内存中分配的顺序做出任何假设 - 你不应该需要来做任何。