0

我试图用 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 数组复制到 2dim 数组的正确方法是什么?

4

2 回答 2

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,那我在做什么呢?clusters+i 的地址为:

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

正是你所期望的。当我离开 test_mygroup_arr 时,我得到 clusters[0][0]、clusters[1][0]、clusters[2][0]、clusters[3][0]、clusters[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;
}
于 2012-09-27T12:02:57.353 回答
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)
于 2012-09-27T11:25:11.287 回答