伸缩型数组成员(C99)

作者:追风剑情 发布于:2020-3-10 19:21 分类:C

示例

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//malloc()、free()
#include <stdlib.h>
#include <time.h>

struct flex
{
	size_t count;
	double average;
	//C99新增的一个特性:
	//伸缩型数组成员必须是结构的最后一个成员
	//结构中必须至少有一个成员
	//伸缩数组的声明类似于普通数组,只是它的方括号中是空的
	double scores[]; //伸缩型数组成员(flexible array member)
};

void showFlex(const struct flex * p);

//argc: 参数个数 argv[]: 参数数组
//int main(int argc, char **argv)
int main(int argc, char *argv[])
{
	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);

	system("pause");
	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);
}

运行测试

1111.png

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号