关于C语言struct的特殊扩展技巧

《Unix/Linux编程实践教程》中P69页,有写道,dirent结构中成员d_name用于存放文件名。注意在此系统中d_name被定义为只有一个元素的数组,这是如何做到的能?因为一个自负的空间只能存放字符串的结束字符。P92也询问,在struct dirent中,数组d_name[]的长度在有的系统上是1,而在有的系统上是是255。实际长度是多少?为什么会有这些不同?
对此,我也一直十分困惑,直到看到《深度探索C++对象模型》P19才终于明白。

01 //比如:
02 struct mumble{
03      /*stuff*/
04      char pc[1];
05 }
06 //是配合了下面的代码的
07 //从档案或标准输入装置中取得一个字符串
08 //然后为struct本身和该字符串配置足够内存
09 struct mumble *pmumbl = (struct mumble*)
10     mallocsizeof (struct mumble) +strlen(string) +1);

 

到这里,应该已经很清楚了,这个c语言的技巧关键在于这个数组位于struct末尾,于是配合malloc实现可变数组。事实上对于struct是越界的,只是申请内存时考虑了越界的容量。

特别注意:这种技巧只存在于C语言的struct中,如果是C++的class,特别是派生类定义了virtual functions等,可能能顺利转化,也可能不行。所以C++中应该避免这种技巧,使用STL的vector等库实现可变数组。

转载请注明:旅途@KryptosX » 关于C语言struct的特殊扩展技巧

时间: 2024-11-02 18:27:55

关于C语言struct的特殊扩展技巧的相关文章

c语言-struct sizeof 的问题

问题描述 struct sizeof 的问题 一:typedef struct S1 { }S1; 这肯定编译过不了! 二:typedef struct S2 { int b; int c; }S2; 在main 输出 sizeof(S2) 输出结果是8 三:typedef struct S3 { int b; int c; char * p; }S3; sizeof(S3) **输出 12 ** 四:typedef struct S4 { int b; int c; char s[0]; }S

c语言struct的声明定义问题,这段代码对吗,怎么理解?

问题描述 c语言struct的声明定义问题,这段代码对吗,怎么理解? static struct { int32_t hold_course_cd; bool locked_course; float locked_course_err; } steer_state = { hold_course_cd : -1, locked_course : false, locked_course_err : 0 }; 解决方案 定义了结构体,然后再定义 了 static 的结构体变量 steer_sta

《圣殿祭司的ASP.NET4.0专家技术手册》---- 1-14 项目同时使用C# 与VB语言及多组件的技巧

1-14 项目同时使用C# 与VB语言及多组件的技巧 圣殿祭司的ASP.NET4.0专家技术手册 早期VS.NET 2002及VS.NET 2003的Visual Studio工具不支持多个组件文件(Assembly),也就是项目编译后只会产生一个dll组件,而一个组件只允许包含一种语言(因为系统会调用对应C#或VB编译程序进行编译),因此在同一个项目中要使用两种语言是办不到的:但在VS 2010中,因为项目支持多个组件,所以利用这个特性就可以同时使用两种以上的语言(如C#与VB),因此.cs或

c语言-C语言STRUCT数组 不知道哪错了

问题描述 C语言STRUCT数组 不知道哪错了 #include int main(void) { int i,j; float temp; struct Students { char num; char name; char sex; char age; float score; }; struct Students student[5]= { {'0001','一号','男','19',99}, {'0002','二号','女','18',96}, {'0003','三号','女','19

php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】_php技巧

本文实例讲述了php实现有序数组打印或排序的方法.分享给大家供大家参考,具体如下: 有序的数组打印或排序对于php来讲非常的简单了这里整理了几个不同语言的做法的实现代码,具体的我们一起来看这篇php中有序的数组打印或排序的例子吧. 最近有个面试题挺火的--把2个有序的数组打印或排序,刚看到这个题的时候也有点蒙,最优的算法肯定要用到有序的特性. 思考了一会发现也不是很难,假如数组是正序排列的,可以同时遍历2个数组,将小的值进行排序,最后会遍历完一个数组,留下一个非空数组,而且剩下的值肯定大于等于已

php-cli简介(不会Shell语言一样用Shell)_php技巧

1.基础知识 1.1 什么是Shell编程? 在 Unix 中,shell 可不是简单的命令解释器(典型的有 Windows 中的 DOS ),而是一个全功能的编程环境.Shell 是操作系统的一部分,用来与用户打交道,并且可以用来协调各个命令[1].用Shell编程可以灵活地解决大量重复任务,十分方便.但是,Shell的语法十分怪异(个人意见),不容易记,如果现在熟悉的语言可以用来写shell那就好了--比如php--就可以快速开发Shell程序了(比如我的Preminder的后台程序),于是

javascript实现C语言经典程序题_javascript技巧

最近在学习Javascript语言,看到网上很多都是在介绍Javascript如何解决网页上问题的代码,所以想另辟蹊径,用Javascript代码来实现C语言经典程序题.当然,这些C语言程序题也是比较简单,主要想通过Javascript语言实现,起到语法练习作用,也想来对比一下C语言和Javascript语言实现的相同点和不同点,从而巩固记忆,加强学习效果!!! 一.C语言经典程序题1 1. 题目描述: 马克思的手稿中有这样一道有趣的数学题:有30个人,其中有男人,女人,小孩.他们在一家饭馆中吃

php 中英文语言转换类代码_php技巧

起初想到制成XML文档形式,这样操作也起来很容易.只是看到说XML效率不怎样 再者就是不同的模板,可这样也有个小问题,有些词汇比如时间提示是不确定,与可能是minute ,day.也有可能复数加 s 那好吧,做成数组,可数组就得做成在php文件的变量,很难做些扩展(我所知道所认为的是这样) 最后做成txt文本文件的形式,同样也为这样的效率担心,打开文件,搜索字符串,截取字符串这些,所幸最后运行了一下,一般机子大概0.0004秒,这让我很惊奇原以为会很慢,毕竟要调用多次. 好吧,上代码 复制代码

php简单实现多语言切换的方法_php技巧

本文实例讲述了php简单实现多语言切换的方法.分享给大家供大家参考,具体如下: 1.主程序代码: <?php include "lib/function.php"; ?> <script src="js/language.js"></script> <?php if(isset($_GET["language"])){ $_SESSION["language"] = $_GET[&qu