对于柔性数组的简单理解:
1、什么是柔性数组?
柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,
也就是所谓的0长度,所以我们可以用结构体来创建柔性数组。
2、柔性数组有什么用途 ?
它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。
3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。
对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们可以进行动态分配, 对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!对于柔性数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:
以下是头文件:
#pragma once
#ifndef __LIST_H__
#define __LIST_H__
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h>
#endif
以下是代码实现:
#include "list.h"
typedef int ElemType;
typedef struct {
int len; //数组长度
ElemType elem[]; //数组
}SoftArray, *PsoftArray;
SoftArray* arrayInit(int n); //初始化
void arrayInput(SoftArray* array); //输入
void arrayPrint(const SoftArray* array); //输出表的内容
int arrayLen(const SoftArray* array); //长度
void arrayDestroy(SoftArray* array); //表的销毁,涉及内存分配,因此必须free
void Fibonacci(int size); //求Fibonacci数列前size项
void test3();
/*
1、什么是柔性数组?
柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,
也就是所谓的0长度,所以我们可以用结构体来创建柔性数组。
2、柔性数组有什么用途 ?
它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。
3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。
对于编译器来说,此时长度为0的数组并不占用空间,因为数组名本身不占空间,它只是一个偏移量,
数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,
我们可以进行动态分配, 对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个
偏移量,代表一个不可修改的地址常量!对于柔性数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等:
*/
//int main()
//{
// printf("------------------柔性数组测试------------------\n");
// test3();
// //printf("%d \n",sizeof(softArray)); 结果为4 说明数组未占用空间
// system("pause");
// return 0;
//}
void test3()
{
/*int len = 5;
PsoftArray p = arrayInit(len);
arrayPrint(p);
arrayInput(p);
arrayPrint(p);*/
int size = 40;
printf("Fibonacci前40项:\n");
Fibonacci(size);
}
SoftArray* arrayInit(int n) //初始化
{
if (n > 0)
{
//SoftArray array;
PsoftArray p;
//声明结构体指针array,动态申请内存,大小为结构体大小+n个ElemType型大小
p = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(ElemType)*n);
memset(p->elem, 0, n * sizeof(ElemType)); //将已开辟内存空间全部字节的值设为值0
p->len = n;
return p;
}
return NULL;
}
void arrayInput(SoftArray* array) //输入
{
assert(array);
printf("input %d elem: ", array->len);
for (int i = 0; i < array->len; i++)
{
scanf("%d ", &array->elem[i]);
}
printf("finish");
}
void arrayPrint(const SoftArray* array) //输出表的内容
{
assert(array);
for (int i = 0; i < array->len; i++)
{
printf("%d ", array->elem[i]);
}
printf("\n");
}
int arrayLen(const SoftArray* array)
{
assert(array);
return array->len;
}
void arrayDestroy(SoftArray* array) //表的销毁,涉及内存分配,因此必须free
{
assert(array);
free(array);
}
void Fibonacci(int size) //求Fibonacci数列前size项
{
PsoftArray ret = NULL;
int i = 0;
if (size > 0)
{
ret = (SoftArray*)malloc(sizeof(ret) + sizeof(ElemType) * size);
ret->len = size;
}
if (1 == ret->len)
{
ret->elem[0] = 1;
}
else
{
ret->elem[0] = 1;
ret->elem[1] = 1;
for (i = 2; i < ret->len; i++)
{
ret->elem[i] = ret->elem[i - 1] + ret->elem[i - 2];
}
}
for (i = 0; i < ret->len; i++)
{
printf("%d ", ret->elem[i]);
if ((i + 1) % 10 == 0)
{
printf("\n");
}
}
free(ret);
}