0

在定义 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

好吧,我可能只是瞎了眼,但在我看来,它们的顺序是 irdc,而且(甚至相反)与定义顺序不同。为什么它们在记忆中的顺序错误?

谢谢帮助:)

4

5 回答 5

1

可能的原因是这些数组具有不同的大小(cmat 是 12 字节,dmat 可能是 96 字节)并且编译器会重新排列它们以适应某些对齐要求。一种常见的技术是首先放置具有最严格对齐要求的对象(ints、doubles),然后放置那些要求最低的对象(如 char 数组)。这样,由于填充而浪费的内存被最小化。

但是,为什么要关心内存中不同对象的顺序呢?如果你想强制一个序列,把它们放在同一个结构中(结构成员必须出现在它们声明的序列中)。

于 2013-10-14T08:15:06.040 回答
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);
}

希望这可以帮助

于 2013-10-14T08:20:09.917 回答
0

在数组和结构的情况下为它们的元素而不是为不同的数组和结构完成连续的内存分配。在其他情况下,包括您的情况,不能保证连续的内存分配。

于 2013-10-14T08:12:52.420 回答
0

全局变量的放置取决于您的编译工具和目标环境。通常你不必关心它,并且可以让工具做正确的事情。

工具可能有一些功能来控制放置,但不是便携式的,只有在真正需要时才应该使用。

于 2013-10-14T08:14:20.647 回答
0

为什么它们在记忆中的顺序错误?

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

于 2013-10-14T08:19:55.117 回答