惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
阮一峰的网络日志
阮一峰的网络日志
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
H
Hacker News: Front Page
H
Help Net Security
云风的 BLOG
云风的 BLOG
H
Heimdal Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
Lohrmann on Cybersecurity
C
Check Point Blog
Google DeepMind News
Google DeepMind News
Forbes - Security
Forbes - Security
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
I
InfoQ
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
I
Intezer
L
LINUX DO - 最新话题
K
Kaspersky official blog
Attack and Defense Labs
Attack and Defense Labs
C
CERT Recently Published Vulnerability Notes
aimingoo的专栏
aimingoo的专栏
S
SegmentFault 最新的问题
NISL@THU
NISL@THU
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threatpost
Y
Y Combinator Blog
S
Security Affairs
Latest news
Latest news
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
C
Cisco Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
Cisco Talos Blog
Cisco Talos Blog
T
Troy Hunt's Blog
S
Securelist
MongoDB | Blog
MongoDB | Blog

博客园 - 进击的程序员

cuowu Angular4+路由 由href return false 来看阻止默认事件 TypeScript的配置文件 tsconfig.json Java标记接口 动手编写TCP服务器系列之一:日志文件 Shell语言系列之一:文件处理 给Amazon ec2 增加卷(Volume)并挂载到系统 Java打包问题之一:打包出现java.io.IOException: invalid header field 面试题之堆栈队列系列一:设计包含min函数的栈 awk处理之案例六:awk根据条件插入文本 程序员的数学之余数:星期数的思考 面试题之实现系统函数系列一:实现memmove函数 awk处理之案例五:awk匹配字段2包含字段1的文本 awk处理之案例四:sort加awk来过滤文本 字符串面试题系列之七:字符串全排列 awk处理之案例三:awk去掉不需要的文本行 awk处理之案例二:awk匹配文本 awk处理之案例一:awk 处理百分比的问题
struct中长度为0的数组用途与原理
进击的程序员 · 2013-08-11 · via 博客园 - 进击的程序员

前言

    在标准C和C++中,长度为0的数组是被禁止使用的。不过在GNUC中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0]; 很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在这儿,它表示的完全是另外的一层意思, 这个特性是不可移植的, 所以,如果你致力于编写可移植,或者是稍稍需要跨平台的代码,这些Trick最好还是收起来的好。

    本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

正文

    在GNU的指南中,它是如此写道:

struct line {
int length;
char contents[0];
};

//...ommit code here

{
struct line *thisline
= (struct line *) malloc (sizeof (struct line) +this_length);
thisline->length = this_length;
}

    这个用法主要用于变长Buffer,structline的大小为4,结构体中的contents[0]不占用任何空间,甚至是一个指针的空间都不占, contents在这儿只是表示一个常量指针,这个特性是用编译器来实现的,即在使用thisline->contents的时候, 这个指针就是表示分配内存地址中的某块buffer,比如malloc(sizeof (struct line) +this_length)返回的是0x8f00a40,thisline->contents指向的位置就是(0x8f00a40+ sizeof(struct line)),而这儿sizeof(struct line)仅仅是一个int的四字节。

    对于这个用法,我们定义的结构体指针可以指向任意长度的内存buffer,这个技巧在变长buffer中使用起来相当方便。可能有朋友说,为什么不把最后的contents直接定义为一个指针呢?这儿的差别是这样的,如果定义为一个指针,它需要占用4Bytes,并且在申请好内存后必须人为赋地址才可以。如果使用这个用法,这个常量指针不占用空间,并且无需赋值。 但是,方便并不是绝对的,在释放分配的内存的时候,由于函数free会认为*thisline只是指向一个4字节的指针,即只会释放length的空间,而对于后面占据大头的buffer却视而不见,这个就需要人为干预;而对于后面的声明指针的方式,则可以直接用Free(thisline->contents)的方式释放掉分配的内存。

    ASSERT:除非必要,不要轻易使用这个功能,GNUC下可以编译通过,所以你在使用vc++,那就不用尝试了,编译都无法通过。

作者

   出处:http://www.cnblogs.com/gina

   本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。