结构成员的嵌套循环赋值

Nested loop assignment to struct member

我想要一个 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);
        }
    }
}

为什么会这样?

将您的代码更改为此,您应该索引 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, 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;
            }
 }

更新:您需要跟踪要向其附加数字的外循环或索引,这样它就不会在每次外循环为 运行 时重写。我是这样做的 test[i + (3*i)]

你需要这样写:

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