柔性数组

柔性数组

* 柔性数组即数组大小待定的数组.
* 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
", 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:
");
    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
",sum(sa->arr,sa->arr+arrNum));
    return 0;
}
原文地址:https://www.cnblogs.com/cz-blog/p/4131029.html