`
891633093
  • 浏览: 48792 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

0 长数组

阅读更多

#include <stdio.h>
#include
<string.h>
#include
<stdlib.h>
struct aa{
   
int a;
   
int b;
};

struct bb{
   
struct aa test[0];
};

int main(void)
{
   
struct bb *p=(struct bb*)malloc(sizeof(struct bb)+sizeof(struct aa)*100);
    p
->test[0].a=10;
    p
->test[0].b=20;
    printf(
"%d,%d\n",p->test[0].a,p->test[0].b);
   
return 0;
}

 

 

 

 

看这个结构体的定义:

 


<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->typedef struct st_type { int nCnt; int item[0]; }type_a;

 

(有些编译器会报错无法编译可以改成:)

 


<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->typedef struct st_type { int nCnt; int item[]; }type_a;

 


    这样我们就可以定义一个可变长的结构,用sizeof(type_a)得到的只有4,就是sizeof(nCnt)=sizeof(int)那个0个元素的数组没有占用空间,而后我们可以进行变长操作了。

 

 

 


<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->// C语言版: type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int)); // C++语言版: type_a *p = (type_a*)new char[sizeof(type_a)+100*sizeof(int)];

 

 

 

 

 

    这样我们就产生了一个长为100的type_a类型的东西用p->item[n]就能简单地访问可变长元素,原理十分简单,分配了比sizeof (type_a)多的内存后int item[];就有了其意义了,它指向的是int nCnt;后面的内容,是没有内存需要的,而在分配时多分配的内存就可以由其来操控,是个十分好用的技巧。
而释放同样简单:

 

 

 


<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->// C语言版: free(p); // C++语言版: delete []p;

 

分享到:
评论

相关推荐

    C语言不定长数组及初始化方法

    C语言不支持不定长数组,要么malloc,要么在动态的指定它的长度 动态数组不能初始化,可使用memset 1.int* p = (int*)malloc(num); 2.int num = 5; arr[num]; 若使用arr[],则需要在后面对齐进行初始化,来指定长度...

    结构体中最后一个数组长度为零

    在Linux系统里,/usr/include/linux/if_pppox.h里面有这样...使用起来非常方便,创建时,malloc一段结构体大小加上可变长数据长度的空间给它,可变长部分可按数组的方式访问,释放时,直接把整个结构体free掉就可以了。

    指针与数组.docx 指针数组:数组类型 *数组名数组长度

    指针与数组 单从字面上来看似乎很难分清它们是什么,我们先来看看指针数组和数组指针的定义。...元素分别是parr[0],parr[1]...parr[4],相当于定义了5个整形指针变量。所以parr就是数组元素是指针的数组,本质为数组。

    二维数组排序

    int i=0, j=0, temp = 0; int[][] nums1 = { { 34, 1, 22, 5 }, { 28, 98, 15, 32 }, { 33, -5, 17, 41 } }; int rows = nums1.length; //二维数组行的长度 int cols = nums1[0].length; //二维数组列的长度 ...

    数组应用——一维数组排序

    定义int型数组arrayorder并赋初值为0,长度为10,以承载该数列; 使用scanf函数动态输入每个元素的值; 对重新赋值后的数组进行排序,按照由大到小排列,并顺序输出排序后的各元素的值。 要求排序操作由一个以数组为...

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

    今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用struct实现变长数组的技术。下面是我在网上找到的一篇讲解很...

    数组中重复的数字_数组中重复的数字_

    找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

    matlab求数组长度的几种方法集合

    matlab求数组长度 在 MATLAB 中,可以使用 length 函数来求数组的长度 如果想要求矩阵的行数或列数,可以使用 size 函数。 如果你只需要矩阵的行数或列数,可以使用如下语句来获取 另外,如果你想要求多维数组的长度...

    逆序输出源数组中的元素

    先要创建一个新数组 newArray[],要求新数组中的元素与原数组逆序,并且如果原数组中的元素值小于0,在新数组中按0存储。试编程输出新数组 中的元素,程序运行结果如下: 原数组为:1,3,-1,5,-2 逆序并处理后的数组为...

    指针数组和数组指针的区别.doc

    //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高...

    react-array-chunk-render:React组件混合以异步渲染长数组子项

    React阵列块渲染我在 IE-8 中使用 React 时有一些经验,当渲染具有长数组输入的子组件时,会导致浏览器中的long script running alert 。 所以这个 react 组件 mixin 是为了避免long script running alert通过将长...

    TIA博途中数组Array【】的基本使用方法详解.docx

    TIA博途中数组Array【】的基本使用方法详解

    Java数组讲解

    //在定义数组时,如果确定数组的各个元素,可以进行静态初始化 ,在创建数组时,给数组元素赋初值 int [] data2 = new int[] {34,56,765,78}; //注意静态初始化时,不需要指定数组的长度 //通过foreach循环遍历, 增强的...

    php将字符串随机分割成不同长度数组的方法

    本文实例讲述了php将字符串随机分割成不同长度数组的方法。分享给大家供大家参考。具体分析如下: 这里使用php对字符串在指定的长度范围内进行随机分割,把分割后... $buffer = substr($str, 0, $p); $str = substr($s

    函数、内存、一维数组、二维数组

    可以自动给数组中的元素从0开始编号,方便操作这些元素。 格式1: 元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 示例:int[] arr = new int[5]; 格式2: 元素类型[] 数组名 = new 元素类型[]{元素...

    访问数组-java

    程序应通过索引,或者通过指定一个大于0的值来查找数字元素,从而获取数组中的值。程序应处理任何在向数组输入数值或访问数组元素时发生的异常。此外,程序还应使用下面定义的NumberNotFoundException异常处理类。...

    JavaSE进阶数组讲义

    6. 数组元素是有下标的,下标从 0 开始,也就是第一个元素的下标为 0,依次类推最后一个 堆内存 length:n 元素 0 元素 1 ........ ....... 元素 n-1 元素的下标为 n-1,我们可以通过数组的下标来访问数组的...

    一维数组 二维数组,函数练习.rar

    定义了一个长度为5的int类型数组,但是未赋值,里面默认5个0,string类型的数组,未赋值的情况下,里面默认是“”; 二、int[] aa = new int[5]{1,2,3,4,5}; 定义了一个长度为5个int类型数组,并且立刻给它5个空都...

    C语言数组操作(长度、输出、拷贝、插入、删除、排序)

    有很详细的注释,可以作为一维数组操作函数进行参考。操作可供选择。 int length(int *array); 返回数组元素个数 int copyarray(int *src, int *dest); 成功返回0, 失败返回-1 int printarray(int *array); 打印 ...

    C/C++中获取数组长度的方法示例

    学过C/C++的人都知道,在C/C++中并没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取其长度,那么对于其他类型的数组如何获取他们的长度呢? 其中一种方法是使用sizeof(array) / ...

Global site tag (gtag.js) - Google Analytics