zoukankan      html  css  js  c++  java
  • 柔性数组

    柔性数组

    * 柔性数组即数组大小待定的数组.
    * 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;
    }
  • 相关阅读:
    联表查询更新
    SQLServer 中多行数据合并成一行数据(一个字段)
    换行和回车的区别
    SQL语句中使用回车换行符
    g2o使用总结
    求导总结
    ubuntu14.04 升级gcc
    如何入门SLAM
    imu和canmera标定
    使用velodyne16线激光雷达跑loam-velodyne------包括激光雷达和imu的标定
  • 原文地址:https://www.cnblogs.com/cz-blog/p/4131029.html
Copyright © 2011-2022 走看看