我试图在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数组的正确方法是什么?
答案 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)