首页 > 其他分享 >柔性数组

柔性数组

时间:2024-04-04 09:11:07浏览次数:210  
标签:flex int length 数组 柔性 array

柔性数组(Flexible Array Member)是 C 语言中的一种特性,允许在结构体的末尾定义一个数组,但是这个数组的大小可以在运行时确定。柔性数组通常用于动态分配内存,特别是在需要保存可变数量元素的情况下非常有用。一般来说,柔性数组的定义方式如下所示:

struct flex_array {
    int length;     // 数组长度
    int data[];     // 柔性数组,没有指定大小
};
在这个结构体定义中,data[] 就是柔性数组。注意它的声明方式和普通数组不同,没有指定固定的大小。在使用柔性数组时,我们需要额外考虑数组的长度,通常会将数组长度作为结构体的一个成员进行存储,以便在运行时确定数组的大小。 要注意的是,柔性数组只能是结构体的最后一个成员,并且结构体必须至少有一个其他的成员。这是因为结构体的大小必须是确定的,而柔性数组的大小是不确定的,所以需要其他的成员来确定结构体的大小。 使用柔性数组时,通常需要通过动态内存分配函数(如 malloc、calloc 等)来为柔性数组分配内存空间。例如:
int array_length = 5;
size_t size = sizeof(struct flex_array) + sizeof(int) * array_length;
struct flex_array *flex = malloc(size);
这样就可以根据需要动态分配包含柔性数组的内存空间了。在使用完柔性数组后,记得通过 free() 函数释放内存。   举个例子:
#include <stdio.h>
#include <stdlib.h>

// 定义包含柔性数组的结构体
struct flex_array {
    int length;
    int data[]; // 柔性数组
};

int main() {
    int array_length = 5;
    
    // 计算结构体大小
    size_t size = sizeof(struct flex_array) + sizeof(int) * array_length;

    // 分配内存
    struct flex_array *flex = malloc(size);

    if (flex == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 设置数据
    flex->length = array_length;
    for (int i = 0; i < array_length; i++) {
        flex->data[i] = i * 2;
    }

    // 打印数据
    printf("柔性数组大小:%ld\n", size);        // int length:4Byte,int data[5]:20Byte,共24Byte
    printf("柔性数组长度: %d\n", flex->length);
    printf("柔性数组数据: ");
    for (int i = 0; i < flex->length; i++) {
        printf("%d ", flex->data[i]);
    }
    printf("\n");

    // 释放内存
    free(flex);

    return 0;
} 
  执行结果如下: 0        

标签:flex,int,length,数组,柔性,array
From: https://www.cnblogs.com/lethe1203/p/18113904

相关文章

  • 在排序数组中查找元素的第一个和最后一个位置
    34.在排序数组中查找元素的第一个和最后一个位置-力扣(LeetCode)题目描述给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂......
  • 翻转数组
    publicclassexample{ publicstaticvoidmain(String[]args){ intarr[]={1,2,3,4,5,6}; inttemp=0; intlen=arr.length; for(inti=0;i<len/2;i++){ temp=arr[len-1-i]; arr[len-1-i]=arr[i]; arr[i]=tem......
  • python如何对二维数组排序
    在Python中对二维数组进行排序是一个常见的需求,可以通过多种方式实现。在本博客中,我们将讨论几种常见的方法来对二维数组进行排序。首先,我们可以使用Python的内置函数sorted()对二维数组进行排序。sorted()函数可以接受一个key参数,通过指定key参数来指定排序的方式。下面是......
  • 2024.3.8力扣每日一题——找出美丽数组的最小和
    2024.3.8题目来源我的题解方法一数学题目来源力扣每日一题;题序:2834我的题解方法一数学经过分析,在target之前,取小于等于target/2的正整数才能使得和最小,并且满足条件3。时间复杂度:O(n)空间复杂度:O(n)publicintminimumPossibleSum(intn,inttarget)......
  • 详解volatile 关键字的作用,Java 中能创建 volatile 数组吗
    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点面试官:volatile关键字的作用可见性:当一个线程修改了volatile变量的值,这个新值对于其他线程是立即可见的。这是因为在多线程环境下,线程在修改volatile变量的值时......
  • KES中数组和集合类型的区别
    文章概要:本文属于学习总结系列,总结了一下数组类型和PL/SQL中集合类型及其使用区别。一,集合(collection)数据它是存放一组数据类型相同的数据,是一组相同类型元素的集合集合数据类型分三类:1).关联数组(indexbytables)元素下标:binary_integer、pls_integer、varchar2字符串......
  • 代码随想录 Day34 贪心算法 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
    1005.K次取反后最大化的数组和 classSolution{public:intlargestSumAfterKNegations(vector<int>&nums,intk){sort(nums.begin(),nums.end());intsum=0;inti=0;while(k>0){nums[i]=0-nums[i]......
  • Go_ if else语句 ,,循环,,switch,,数组
    if-else语句//if语法if定义变量;条件{}elseif条件{}else{}//输入分数,打印成绩等级packagemainimport"fmt"//iffuncmain(){ //1接收用户输入 varscoreint=0 fmt.Print("请输入分数:") fmt.Scan(&score) showLevel(score)......
  • 转轮数组
    1、题目要求给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]2、题解1class......
  • 力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码
    349.两个数组的交集,387.字符串中的第一个唯一字符,394.字符串解码,每题做详细思路梳理,配套Python&Java双语代码,2024.04.02 可通过leetcode所有测试用例。目录349.两个数组的交集解题思路完整代码PythonJava387.字符串中的第一个唯一字符解题思路完整代码Python......