C语言struct中的长度可变数组(Flexible array member)

C_struct中的长度可变数组(Flexible array member)

Flexible array member is a feature introduced in the C99 standard of the C programming language (in particular, in section §6.7.2.1, item 16, page 103). It is a member of a struct, which is an array without a given dimension, and it must be the last member of such a struct, as in the following example:

struct vectord {
    uint8_t  len;
    double   arr[]; // the flexible array member must be last
};
  • arr[]不占用结构体的存储空间,sizeof(strcut vectord)的值为1
  • 变长数组必须是结构体的最后一个成员
  • 结构体变量相邻的连续存储空间是arr[]数组的内容
  • gcc中使用0长度的数组arr[0]来表示变长数组。
struct vectord *allocate_vectord (size_t len) {
   struct vectord *vec = malloc(offsetof(struct vectord, arr) + len * sizeof(vec->arr[0]));

   if (!vec) {
       perror("malloc vectord failed");
       exit(EXIT_FAILURE);
   }

   vec->len = len;

   for (size_t i = 0; i < len; i++)
       vec->arr[i] = 0;

   return vec;
}

原文地址:https://www.cnblogs.com/gexin/p/9116292.html

时间: 2024-10-29 17:02:48

C语言struct中的长度可变数组(Flexible array member)的相关文章

如何自定义一个长度可变数组

摘要:本文主要写了如何自定义一个长度可变数组 数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按无序的形式组织起来的一种形式 在定义之初,数组的长度就被定义 新建数组有很多方式 下面两个都可以 但一般书写习惯会选择第一种 1 String[] array = new String[5]; //新建一个长度为5的字符串数组 1 String array[] = new String[5]; // 新建一个长度为5的字符串数组 由于数组的长度一旦初始化就无法改变,所以我们需要另辟思路 假如

OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray array]; // for (int i = 0; i < 13; i ++) { // [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; // } // NSLog(@"%@",arr);

柔性数组成员 (flexible array member)-C99-ZZ

学习flexible array member是因为阅读Redis源码遇到的,sds.h中一开始就用到了. ============================================================================================== 在讲述柔性数组成员之前,首先要介绍一下不完整类型(incomplete type).不完整类型是这样一种类型,它缺乏足够的信息例如长度去描述一个完整的对象. 6.2.5 Types incomplete

IOS 中runtime 不可变数组__NSArray0 和__NSArrayI

大家可能都遇到过项目中不可变数组避免数组越界的处理:runtime,然而有时候并不能解决所有的问题,因为类簇不一样 #import "NSArray+Security.h" #import "NSObject+Swizzling.h" @implementation NSArray (Security) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{

Java实现长度可变数组

1.数组:数组是一种数据结构,用来储存同一种类型值得集合,数组一旦被创建就不能改变它的大小. 2.既然数组的长度是不可改变的,那么怎么实现长度可变呢? 思路:既然数组长度不可变,那么我们可以创建一个长度与原数组不同的新数组,让原数组变量指向新数组,从而实现长度可变(新数组如果没有使用,那么就会被java垃圾回收机制回收销毁,从而不浪费内存空间.) a)直接创建新数组,让原数组变量指向新数组. import java.util.Arrays; /** * 这是我们用来测试的类 * * @autho

从零开始学习R语言(四)——数据结构之“数组(Array)”

本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/60141207 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/12567789.html 4. [三维+]:数组(Array) R语言中数组可以看做是矩阵的扩展,它将矩阵扩展到2维以上.如果给定的数组是1维的则相当于向量,2维的相当于矩阵.R语言中的数组元素的类型也是单一的,可以是数值型,逻辑型,字符型或复数型等. R语言中数组的使用 4.1 数组的创建 语法:array

[C] 在 C 语言编程中实现动态数组对象

对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态数组. /* Author: [email protected] */ 基本的 C 数组 C 语言编程中声明一个基本数组如下: int main() { // 声明一个容纳 3000 个整数的数组 int my_array[3000]; } 以上代码做了两件事: ● 在栈区开辟内存空间.准确说来是在

黑马程序员-OC加强学习日记-Foundation框架中的字符串和数组

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.Foundation框架 1.概念:框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易. 为所有程序开发奠定基础的框架称为Foundation框架 2.使用:要想使用Foundation框架中的功能,包含它的主文件即可 #import <Foundation/Foundation.h> 二.NSString: 不可变字符串类   一个NSString对象

可变数组NSMutableArray

//NSMutableArray 继承至 NSArray // NSArray * array = @[]; //1.创建可变数组 NSMutableArray * array = [[NSMutableArray alloc] initWithCapacity:0]; //使用addObject 动态给数组中增加元素 /* [array addObject:@"one"]; [array addObject:@"two"]; [array addObject:@&