关于结构体的一个特殊用法(总觉得遇到的问题就该记录一下哇)

关于结构体的一个特殊用法

//写法一

struct array {
     int count;
    char *buf;
}

//写法二

struct array {
     int count;
    char buf[0];
}

如果一个buf用作一个buffer的话,这时候如果malloc一块内存,

用方法一,buf是指针的话,指向这块申请出的内存的话,这里array结构体和buf指向的buffer就是分开的。

而用方法二的时候,申请出的buffer和结构体buffer是连接在一起的。

这么说有点抽象。

非常感谢@凯旋冲锋 给出的demo代码。。。我之前看过用法,WTF,忘记了。。。

时间比较仓促,就不贴手敲的了,直接给出@凯旋冲锋 给出的demo

对于第一种方案,这里要malloc两次,free两次

对于第二种方案,这里仅仅需要malloc一次,free一次即可

后话:

这个“特殊用法”提示我们,在管理内存的时候,尽量不要将内存碎片化,使得代码维护的难度加大,可以想一些(积累一些)比较好的方法,使得申请的内存是连续的,便于free管理

特别谢谢Essential On linux & C群友

——EOF

克拉姆斯柯依 (1837-1887),出生在俄国沃龙涅什省奥斯特罗戈日斯克的市民家庭,16岁做照相制版学徒,1857年20岁时考入彼得堡美术学院。年轻画家是一位关心社会和大众命运的人,常为不平等的社会而苦恼。

《无名女郎》

关于结构体的一个特殊用法(总觉得遇到的问题就该记录一下哇)

时间: 2024-12-26 07:42:24

关于结构体的一个特殊用法(总觉得遇到的问题就该记录一下哇)的相关文章

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字. 第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结构体

柔性数组(结构体最后一个域为0/1数组)

结构体最后的长度为0或1数组的作用(转载) 2012-05-07 17:07:09 其实很 早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们 的分享,这是我前进的动力!同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,

结构体中typedef语句用法总结

typedef为C语言的关键字,作用是为一种数据类型(这里仅讨论结构体数据类型)定义一个新名字.在编程中使用typedef目的一般有两个:给变量一个易记且意义明确的新名字:简化一些比较复杂的类型声明.1.typedef的最简单使用      typedef int Data;   //给已知数据类型int起个新名字---Data. 2.typedef 用法 & 结构体   typedef struct Node{           int info;           char flag;

C语言,结构体(struct)的详细用法

结构(struct)      结构是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合.   结构中可以使用不同的数据类型.       1. 结构说明和结构变量定义       在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此,  象其它   类型的变量一样, 在使用结构变量时要先对其定义.       定义结构变量的一般格式为:        struct 结构名        {             类型  变量名;             类型  变量

用结构体实现一个电话本

结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢?     一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等).我们先来定义一个结构体.     typedef struct Pdhb-info     {       char name[5];       char sex[3];       int age;       char tele[12];       char addr[30];     }Pd

C语言用结构体写一个通讯录

今天写了个通讯录,给大家看一下 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> extern meau();//目录函数就没写出来了,大家可以自己写一下 typedef struct T//定义一个结构体 { char name[10]; char sex[4]; int age; char tetl[13]; char add[20

C语言利用结构体实现一个通讯录

实现一个通讯录: 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供以下方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 以名字排序所有联系人 7. 清空所有联系人 student.h: #ifndef __CRT #define _CRT_SECURE_NO_WARNINGS 1 #endif #ifndef __STUDENT #ifndef __STDIO_H

delphi 结构体和TList的用法

type  PRecord = ^TMyRec;  TMyRec = record    s: string[8];    i: integer;    d: double;end;var   MyList: TList;  PR: PRecord;begin  MyList := TList.Create;        try    New(PR);    PR.s := '10000001';    PR.i := 1001;    PR.d := 0.1;    MyList.Add(P

C结构体的用法详解

1. #include<stdio.h> struct Student//定义结构体 { char name[10]; int age; }; int main() { struct Student stu;//声明结构体变量 scanf("%s%d",stu.name,&stu.age); printf("%s %d\n",stu.name,stu.age); return 0; } 2. #include<stdio.h> str