0长数组介绍

0长数组介绍:也叫柔性数组

用途:为了满足需要变长度的结构体

用法:在一个结构体的最后,申明一个长度为0的数组,就可以实现这个结构体长度的可变,如:

typedef struct _Student

{

  int Age;

  int Length;

  char Info[0];//0长数组

}Student,*pStudent;

说明:

1、长度为0的数组并不占用空间,sizeof(Student)=8。

2、它只是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量。

优缺点:

优点:比起在结构体中声明一个指针变量,再进行动态分配的办法,这种方法效率要高,因为在访问数组内容时,不需要间接访问,避免了两次访存。

缺点:在结构体中,为0的数组必须在最后声明,使用上有一定限制。

例子:

#include <QApplication>

#include <QDebug>

#include <QString>

int main(int argc,char* argv[])

{

  //局部变量

  int age = 10;

  QString name = "张三";

  //创建并初始化

  Student* student = (Student*)malloc(sizeof(Student) + name.length());

  student->Age = age;

  student->Length = name.length();

  memcpy(student->Info,name.toLocalBit8().data(),name.length());

  //打印

  qDebug()<<stutent->Age<<student->Info;

  //释放(一次释放即可)

  free(student);

  student = NULL;

}

原文地址:https://www.cnblogs.com/zhangnianyong/p/12199964.html

时间: 2024-10-09 13:23:08

0长数组介绍的相关文章

c/c++的0长数组(柔性数组)

在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的. 但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如: StructPacket { Int state; Int len; Char cData[0]; //这里的0长结构体就为变长结构体提供了非常好的支持,可以指向独立的数据空间 }; 首先对0长数组做一个解释: 用途 :长度为0的数组的主要用途是为了满足需要变长度的结构体. 用法 :在一个结构体的最后 ,申明一个长度为

C语言中变长数组的使用方法

先说说我的理解: struct example{ __u16 tag_type; __u16 tag_len; char tag_data[0]; } __attribute ((packed)); 1. 存在的意义:当结构体的长度变长时,例如里面有一个字符串时,为了方便管理内存. 这个结构体不要用struct example a的方式定义, 而应用struct example *a; a = (struct example *)malloc(sizeof(struct example) + e

C 语言变长数组 struct 中 char data[0] 的用法

1.结构体内存布局(padding) 为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制.这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足:第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充. The following typical alignments are va

C语言变长数组 struct中char data[0]的用法

版权声明:本文为博主原创文章,未经博主允许不得转载. [cpp] view plain copy print? 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用struct实现变长数组的技术.下面是我在网上找到的一篇讲解很清楚的文章. 在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组.此时,我们可以使用结构体的方法实现C语言变长数组. struct MyData { int nL

链接脚本在编程中的高级运用之一:可变长数组

作为嵌入式软件工程师,应该要清楚程序的每一条指令在哪里,什么时候会被加载到内存,什么时候会被执行.链接脚本会明确告诉你程序的代码和数据在内存中的分布.精确控制代码和数据在内存中的分布是高效利用内存资源的前提.自定义链接脚本是资深嵌入式软件工程师的必备技能,更是嵌入式架构师的最基本要求.此外,灵活定制链接脚本在编程方面有更高级的应用. 一.编译链接原理 简单讲述编译链接的基本原理有助于后面内容的理解. a. 简单点说,一个可执行程序包括文件头.代码段(.text).数据段(.bss).符号段等信息

C++内存分配及变长数组的动态分配

//------------------------------------------------------------------------------------------------ 第一部分 C++内存分配 //------------------------------------------------------------------------------------------------ 一.关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配

[nowCoder] 两个不等长数组求第K大数

给定两个有序数组arr1和arr2,在给定一个整数k,返回两个数组的所有数中第K小的数.例如:arr1 = {1,2,3,4,5};arr2 = {3,4,5};K = 1;因为1为所有数中最小的,所以返回1: arr1 = {1,2,3};arr2 = {3,4,5,6};K = 4;因为3为所有数中第4小的数,所以返回3: 要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N})). 这题目的难度在于时间复杂度请达到O(log(min{M,N})),参

变长数组_相乘取结果

//变长数组 相乘取结果 #include <stdio.h> int main(void){ // int array_01[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int array_02[4][3] = {12,11,10,9,8,7,6,5,4,3,2,1}; int result[3][3] = {0}; int i, j, k; for (i = 0; i < 3; i ++){ //遍历array_01数组元素 for (j = 0;j

C之变长数组

变长数组是C99标准新加入的一个特性,它的加入大大方便了我们的编程,所谓变长数组,不是数组的长度可变,而是指允许使用变量来定义数组.这可以使我们写出更具通用性的函数.下面是一个例子,函数sum2d完成将一个二位数组中的所有数值相加并返回其和. #include<stdio.h> #define SIZE 10 #define LOC 2 #define ROW 4int sum2d(int loc, int row, int num[loc][row]); int main(void){ in