首页 > 代码库 > 柔性数组

柔性数组

柔性数组

* 柔性数组即数组大小待定的数组.
* C语言中结构体的最后一个元素可以是大小未知的数组
* 由于c 语言中第一数组是,必须声明数组的大小,所以数组大小是固定的,当程序需要变长数组是不被允许的,所以巧妙地使用结构体,构造弹性数组,可以转化为可变长的数组,
* C语言中可以由结构体产生柔性数组
 1 #include <stdio.h> 2 #include <malloc.h> 3  4 typedef struct _soft_array 5 { 6     int len; 7     int array[]; 8 }SoftArray; 9 10 int main()11 {  12     int i = 0;13     SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10);14     15     sa->len = 10;16     17     for(i=0; i<sa->len; i++)18     {19         sa->array[i] = i + 1;20     }21     22     for(i=0; i<sa->len; i++)23     {24         printf("%d\n", sa->array[i]);   25     }26     27     free(sa);28     29     return 0;30 }

 

柔性数组的结构如何只能堆上生成

柔性数组即int array[],是C99的扩展,简而言之就是一个在struct结构里的标识占位符(不占结构struct的空间)。

sizeof(SoftArray)=4,可以看出,结构体成员array是不占结构体的内存空间的.他会默认在堆区声明结构体的后边,当为其赋值是他就会扩展.

写一个简单程序,应用一下,计算任意系列int 型数据的和.代码如下:

#include <stdio.h>#include <malloc.h>int sum(int *start,int *end){    int total=0;    while(start<end)    {        total+=*start++;    }    return total;}typedef struct st_arr{    int len;    int arr[];}SoftArray;int main(){    int arrNum;    int i;        printf("please input the number of Array:\n");    scanf("%d",&arrNum);    SoftArray *sa=malloc(sizeof(SoftArray)+sizeof(int)*arrNum);    sa->len=arrNum;    for(i=0;i<arrNum;i++)    {        scanf("%d",&sa->arr[i]);    }    printf("sum:%d\n",sum(sa->arr,sa->arr+arrNum));    return 0;}

 

柔性数组