建立结构声明
struct book{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
关键字struct表明跟在其后的是一个结构, 后面是一个可选的标记,随后程序可使用该标记引用该结构
struct book library;
伸缩型数组成员(flexible array member)(c99)
利用该特性声明的结构其最后一个数组成员有如下特性:
- 该数组不会立即存在
- 使用该伸缩数组成员可以编写合适的代码, 如同其确实存在且具有所需数目的元素。
声明规则:
1.伸缩型数组必须是结构的最后一个成员;
2. 结构中至少有一个成员;
3. 伸缩数组的声明方括号是空的。
struct flex
{
int count;
double average;
double scores[]; //伸缩型数组成员
};
c99的意图是希望能程序员声明一个指向struct flex的指针, 使用malloc()来进行空间的分配
struct flex *pf;
pf = malloc(sizeof(struct flex) + 5 * sizeof(double));
scores此时表示一个内含5个double类型的数组。
使用指针来进行访问:
pf ->count = 5;
pf -> scores[2] = 18.5;
#include <stdio.h>
#include <stdlib.h>
struct flex
{
size_t count;
double average;
double scores[];
};
void showFlex(const struct flex* p);
int main(void)
{
struct flex* pf1, * pf2;
int n = 5;
int i;
int tot = 0;
pf1 = malloc(sizeof(struct flex) + n * sizeof(double));
pf1->count = n;
for (i = 0; i < n; i++)
{
pf1->scores[i] = 20.0 - i;
tot += pf1->scores[i];
}
pf1->average = tot / n;
showFlex(pf1);
n = 9;
tot = 0;
pf2 = malloc(sizeof(struct flex) + n * sizeof(double));
pf2->count = n;
for (i = 0; i < n; i++)
{
pf2->scores[i] = 20.0 - i / 2.0;
tot += pf2->scores[i];
}
pf2->average = tot / n;
showFlex(pf2);
free(pf1);
free(pf2);
return 0;
}
void showFlex(const struct flex* p)
{
int i;
printf("Scores : ");
for (i = 0; i < p->count; i++)
printf("%g ", p->scores[i]);
printf("\nAverage: %g\n", p->average);
}
- 伸缩型数组成员不能用用结构进行复制或拷贝
*pf2 = *pf1;
该操作只能拷贝除伸缩型数组成员以外的其他成员, 需要拷贝时应使用memcpy()函数
- 不能以按值方式把这种结构传递给结构, 按值传递一个参数与赋值类似, 要把结构地址传递给函数。
- 不能使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。
这种类似于在结构中最后一个成员是伸缩型数组的情况称为struct hack, struct hack 还特指大小为0的数组。
struct hack 是针对gcc的, 不属于c标准;
然而伸缩型数组成员方法是标准认可的。