- 浏览: 380014 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (229)
- java编程 (4)
- java实用程序 (2)
- 算法设计 (34)
- 数据库 (8)
- ACM模板 (12)
- 技术术语 (1)
- java_web (3)
- php (22)
- eclipse (3)
- linux (25)
- linux命令使用心得 (3)
- web服务器 (8)
- IT知识 (2)
- 前端技术 (17)
- 开源软件 (5)
- vim (3)
- linux多线程 (9)
- web开发经验 (3)
- lua (5)
- linux编程 (3)
- smarty (1)
- mysql (4)
- Hive (2)
- 数据挖掘 (9)
- python (2)
- 生活 (1)
- C++ (2)
- 计算机 (1)
- objective-c (11)
- css (2)
- 游戏 (1)
- Mac (1)
最新评论
-
lr544463316:
我的怎么不行呀.....
Mysql Access denied for user ''@'localhost' to database 的一种解决方法 -
babaoqi:
使用时需要注意group_concat函数返回值的最大长度=g ...
mysql中的group_concat函数 -
代码能力弱成渣:
可以帮我看下我的代码么?我自己写的sam,也有ac过题的,但是 ...
求两个字符串的最长公共连续子序列(SAM实现) -
atgoingguoat:
有1000个?不过还是收藏下。
jquery常用的插件1000收集(转载)
转载自:http://www.cnblogs.com/diyunpeng/archive/2010/01/12/1645877.html
长度为0的数组——C语言的非标准用法之一
在标准C和C++中,长度为0的数组是被禁止使用的。不过在GNU C中,存在一个非常奇怪的用法,那就是长度为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,struct line的大小为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:除非必要,不要轻易使用这个功能,GNU C下可以编译通过,所以你在使用vc++,那就不用尝试了,编译都无法通过。
---------------------------------------------------------------------------------------------------------------------------
今天无意以为博友翻到我这篇老帖子,这也是当时我学习转载的,结果没加上转载。。。
我很多帖子都是转载,都是当时看看没求甚解,现在还是老样子,我计划看看这部分源码,加深一下,要不被找错多惭愧,先贴一段老外的话:
Without going thru how malloc works, Linux uses a version of Doug Lea's malloc program. When it allocates memory it uses two longs, and they muist live right next to each other for free to work. The first long is the length of the memory block allocated, the second is a pointer to the start of the block. The second one is the pointer that malloc returns.
顺手找到Doug Lea这个可爱的老头大师的文章:
http://blog.csdn.net/vincent_smz/article/details/6338417
后续的,我利用周末再看。
-----------------------------------------------------------------------------------------------------------------------------
在读帖子的时候,我对我之前的两个评论收回,还是理解不够深,free必须释放malloc分配的内存,如果free随意释放的话,会导致malloc管理的内存链出现问题:
If you inadvertantly swap the second one (the pointer ) with another pointer - ie., one that does not live nextdoor to the correct length value, free corrupts the blocks of heap memory that malloc handles. This causes all sorts of problems - free segfaulting, heap memory being incorrectly overwriteen, other segfaults.
This is what you have. Some other unix systems base memory allocation on where the pointer is "aimed" not where the pointer "lives in memory".
上述英文来自:
发表评论
-
Shell 显示带颜色字体
2014-10-24 14:45 807转自:http://www.linuxidc.c ... -
awk命令使用
2014-05-08 20:37 540输出把一个文件中最长的行的长度(test.log是文件名): ... -
ubuntu快捷键设置大全
2013-01-26 16:47 1467转自:http://xiongyongyuan1234.bl ... -
linux重要文件或目录
2012-12-28 11:06 717#/proc/sys/fs/file-max 一个整数,表示 ... -
/proc/pid目录下文件的含义
2012-12-27 18:56 2965attr: 进程的属性 cmdline: 启动进程 ... -
根据pid判断某个进程是否存在
2012-12-18 16:36 3138#命令“ps -af”的第一列就是进程id #${pid}是 ... -
/var/lock/subsys作用
2012-12-18 16:33 5342转自: http://sunxiaqw.blog.163.co ... -
设置了O_APPEND,lseek的操作将无效
2012-10-04 19:30 2632下面 的代码说明,设置了O_APPEND,语句“lseek(f ... -
shell实现在头文件搜索目录中搜索指定的头文件
2012-10-04 14:22 862#!/bin/bash # 搜索头文件的路径 if [ $ ... -
shell实现查找某目录下所有的文本文件
2012-09-24 13:11 1008第一个参数是要查找的目录 #!/bin/bash ... -
MakeFile预定义变量
2012-09-23 12:16 1306转自:http://hi.baidu.com/ueszx ... -
/usr/bin/ld: cannot find -l* 错误的解决方法……
2012-09-02 14:25 1580转自: http://navyaijm.blog.51cto. ... -
pthread_kill的用法
2012-08-26 23:37 9613#include <pthread.h> #in ... -
sed使用命令
2012-08-26 22:41 639删除一个文件中的空行,假设文件明是test.cpp,保证当前目 ... -
no debugging symbol的原因
2012-08-26 00:21 592执行 gdb youpropgram的时候出现“no debu ... -
VMware Workstation 安装ubuntu
2012-08-17 21:10 869转自: http://wenku.baidu.com/view ... -
linux解决“No manual entry for”问题的方法
2012-08-16 12:36 4050转载自: http://www.centos.bz/2011/ ... -
Linux系统的头文件和库文件搜索路径
2012-08-15 20:17 999转载自:http://my.oschina.net/al ... -
linux安装memcached
2012-08-15 12:35 955所需软件: libevent-2.0.19-stable.t ... -
安装lilnux各分区大小推荐
2012-07-02 16:24 837ubuntu: /usr —— 12G /var — ...
相关推荐
matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度matlab数组长度...
matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求数组长度matlab求...
在MATLAB中,可以使用length函数来求取数组的长度(或者称为数组的元素个数)。length函数返回数组的最大维度大小。下面是一些示例来说明如何使用length函数来求取数组的长度: 一维数组的长度: Matlab code arr ...
matlab怎么得到数组长度,MATLAB:使⽤字段作为结构数组 确定结构数组的总长度⼤⼩... 我有⼀个结构数组包含字段作为不同长度的结构数组.例如: ‘s’是⼀种结构 ‘data’是’s’中的⼀个字段,也是⼀个结构数组本⾝ ...
不改变长度删除数组中的元素,程序完全可以运行,方便大家学习交流
本程序可以由用户确定数组的长度,再通过用户输入数组的值,遍历并打印出来
在Linux系统里,/usr/include/linux/if_pppox.h里面有这样...使用起来非常方便,创建时,malloc一段结构体大小加上可变长数据长度的空间给它,可变长部分可按数组的方式访问,释放时,直接把整个结构体free掉就可以了。
输入一个数组,数组的长度有用户输入,然后再一次输出数组的元素。
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
matlab怎么求数组的长度和维数matlab怎么求数组的长度和维数matlab怎么求数组的长度和维数matlab怎么求数组的长度和维数matlab怎么求数组的长度和维数matlab怎么求数组的长度和维数matlab怎么求数组的长度和维数...
此项实现了java数组不方便使用的优化,修护了数组不可更改长度的说话,面向对象的编程思想,小小提示可以当工具类使用
echo 数组的长度:${#arr[*]} for var in ${arr[@]} do echo 打印的内容:$var done 输出的内容如下: 以上就是Linux shell数组循环的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助...
指针数组:数组类型 *数组名[数组长度]; 例:int *parr[5]; 数组指针:类型名 (*指针名)[数组长度]; 例:int (*parr)[5]; 现在我们再来通过上面的定义来分析一下指针数组和数组指针。 int *parr[5];因为优先级的关系...
2.可以把结构体中定义了零长度数组的地方 视为结构体的结尾,在它之后最好不要再定义任何字段 4.等价写法:typedef struct user_def{
主要介绍了Go语言获取数组长度的方法,实例分析了len函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
C++简单模拟实现不定长数组,简化操作
二维数组的声明和使用ppt介绍很快可以上手练习和理解用的
cpp代码-(一维数组/动态存储)按指定长度生成动态数组,随机赋值给元素,而后输出原数组与逆置后数组
数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。 注意:如果你熟悉C/C++,请注意, Java数组的工作原理与它们不同。 1、数组...