嵌套循环分配给struct成员

时间:2015-12-01 20:24:29

标签: c arrays struct malloc

我希望TestStruct的实例数组包含int类型的单个成员。我希望输出

1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6

但它是0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

我有点难过,因为我真的不知道这是怎么回事:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int num;
} TestStruct;

int main(void) {
    int i, j;
    TestStruct *test = malloc(sizeof(TestStruct) * 18);

    for (i = 1; i <= 3; i++) {
        for (j = 0; j < 6; j++) {
            test[i].num = i;
        }
    }
    for (i = 0; i < 18; i++) {
        printf("%d ", test[i].num);
    }

    return 0;
}

如果我只是在嵌套的for循环中调用printf(),它可以正常工作:

#include <stdio.h>

int main(void) {
    int i, j;

    for (i = 1; i <= 6; i++) {
        for (j = 0; j < 3; j++) {
            printf("%d ", i);
        }
    }
}

为什么会这样?

2 个答案:

答案 0 :(得分:3)

你需要这样写:

for (i = 0; i < 6; i++) {
        for (j = 0; j < 3; j++) {
            test[i*3+j].num = i+1;
        }
  }

答案 1 :(得分:2)

将代码更改为此,您应该将 i 元素编入索引而不是 j

 for (i = 1; i <= 3; i++) {
        for (j = 0; j < 6; j++) {
            test[j + (3*i)].num = i;
        }
  }

以上代码将打印出来 111111222222333333

为了实现1,1,1,2,2,2,3,3,4,4,4,5,5,5,6,6,6,您的代码应如下所示

for (i = 1; i <= 6; i++) {
            for (j = 0; j < 3; j++) {
                test[j + (3*i)].num = i;
            }
 }

更新:您需要跟踪要附加数字的外部循环或索引,以便每次运行外部循环时都不会重写。我这样做是测试[i +(3 * i)]