当我们需要一个包含多个子数组的结构,每个子数组从 1 开始,依次增加到对应的长度,例如:
• 长度为 n 的主数组
• 第 i 个子数组的内容为 [1, 2, …, i+1]
需要创建一个包含子数组的结构体,每个子数组包含从 1 到 i+1 的整数。参考代码如下:
#include <assert.h>
#include <stdlib.h>
typedef struct {
int n;
int *l;
double **data;
} Arrays;
Arrays* BlockInitialization_alt(int n) {
assert(n > 0);
struct {
Arrays A;
int l[n];
double *data[n];
double d[n * ((size_t)n + 1) / 2];
} *all = malloc(sizeof *all);
if (all == NULL) {
return NULL;
}
Arrays* A = &all->A;
A->n = n;
A->l = all->l; // 指向数组,而不是数组地址
A->data = all->data; // 指向数组,而不是数组地址
double *d = all->d;
for (int i = 0; i < n; i++) {
A->l[i] = i + 1;
A->data[i] = d;
for (int j = 0; j < i + 1; j++) {
A->data[i][j] = j + 1;
}
d += i + 1;
}
return A;
}