柔性数组
柔性数组
* 柔性数组即数组大小待定的数组.
* 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; }