结构和多维数组

时间:2012-09-27 11:15:57

标签: c arrays struct

我试图在C

中讨论二维数组(结构)的概念

说我有以下定义:

typedef struct group group;

struct group {
    int members;
    int neighbours;
    char color;
};

#define NUM_CELLS 10

使用以下函数将一些数据从单个数组复制到多维数组:

void test_mgroup_arr(group clusters[][NUM_CELLS],group tests[NUM_CELLS], int num_groups) {

    int i;
    int j = 0;

    for (i = 0; i < num_groups; ++i)
        clusters[i][j] = tests[i];
}

这称为:

int num_groups = 5;
group clusters[NUM_CELLS][NUM_CELLS];

group tests[NUM_CELLS];
tests[0].members = 101;
tests[0].neighbours = 111;

tests[1].members = 102;
tests[1].neighbours = 112;

tests[2].members = 103;
tests[2].neighbours = 113;

tests[3].members = 104;
tests[3].neighbours = 114;

tests[4] = tests[3];

test_mgroup_arr(clusters, tests, num_groups);

我希望函数中的代码将测试数组中的5个项目复制到多维数组中的正确位置。但是,这不能按预期工作,甚至在某些情况下会出现段错误。

这怎么不对?将结构体从1dim数组复制到2 dim数组的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我没有看到您如何传递数组或访问它的问题。代码实际上看起来正确,并给我正确的结果。注意:

for(i = 0; i < num_groups, ++i)
   clusters[i][j] = tests[i];

让我们说地址:

clusters[0][0] is 0x0047F7EC
clusters[1][0] is 0x0047F864
clusters[2][0] is 0x0047F8DC

sizeof(group) = 0xC * 0xA (num of groups) = 0x78

所以你可以在这里看到数学运算。 j总是== 0,所以我在做什么? cluster + i的地址是:

0x0047F7EC for i=0
0x0047F864 for i=1
0x0047F8DC for i=2

正是你所期待的。当我离开test_mygroup_arr时,我得到了簇[0] [0],簇[1] [0],簇[2] [0],簇[3] [0],簇[4] [0]的值。分别设置为tests [0],tests [1],tests [2],tests [3],tests [4]中的值。

这就是你的意思吗?

您是否尝试打印地址以查看发生了什么?你的代码还有更多你没有展示的吗?我想知道是否有其他原因导致你的错误。 我假设您使用的是C99编译器?

注意:我对您的代码运行良好的测试只是您发布的内容。

int main()
{
   int num_groups = 5; 
   ...
   test_mgroup_arr(clusters, tests, num_groups); 
   return 0;
}

答案 1 :(得分:0)

实际上要将数组作为参数传递,你必须在它的第一个元素上传递指针,这就是编译器所期望的,所以而不是

void test_mgroup_arr(group clusters[][NUM_CELLS],group tests[NUM_CELLS], int num_groups) 使用

void test_mgroup_arr(group (*)[NUM_CELLS],group tests[NUM_CELLS], int num_groups)