- 浏览: 389339 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 836转自:http://www.linuxidc.c ... -
awk命令使用
2014-05-08 20:37 580输出把一个文件中最长的行的长度(test.log是文件名): ... -
ubuntu快捷键设置大全
2013-01-26 16:47 1507转自:http://xiongyongyuan1234.bl ... -
linux重要文件或目录
2012-12-28 11:06 749#/proc/sys/fs/file-max 一个整数,表示 ... -
/proc/pid目录下文件的含义
2012-12-27 18:56 2995attr: 进程的属性 cmdline: 启动进程 ... -
根据pid判断某个进程是否存在
2012-12-18 16:36 3173#命令“ps -af”的第一列就是进程id #${pid}是 ... -
/var/lock/subsys作用
2012-12-18 16:33 5408转自: http://sunxiaqw.blog.163.co ... -
设置了O_APPEND,lseek的操作将无效
2012-10-04 19:30 2679下面 的代码说明,设置了O_APPEND,语句“lseek(f ... -
shell实现在头文件搜索目录中搜索指定的头文件
2012-10-04 14:22 904#!/bin/bash # 搜索头文件的路径 if [ $ ... -
shell实现查找某目录下所有的文本文件
2012-09-24 13:11 1055第一个参数是要查找的目录 #!/bin/bash ... -
MakeFile预定义变量
2012-09-23 12:16 1341转自:http://hi.baidu.com/ueszx ... -
/usr/bin/ld: cannot find -l* 错误的解决方法……
2012-09-02 14:25 1661转自: http://navyaijm.blog.51cto. ... -
pthread_kill的用法
2012-08-26 23:37 9685#include <pthread.h> #in ... -
sed使用命令
2012-08-26 22:41 668删除一个文件中的空行,假设文件明是test.cpp,保证当前目 ... -
no debugging symbol的原因
2012-08-26 00:21 622执行 gdb youpropgram的时候出现“no debu ... -
VMware Workstation 安装ubuntu
2012-08-17 21:10 901转自: http://wenku.baidu.com/view ... -
linux解决“No manual entry for”问题的方法
2012-08-16 12:36 4205转载自: http://www.centos.bz/2011/ ... -
Linux系统的头文件和库文件搜索路径
2012-08-15 20:17 1036转载自:http://my.oschina.net/al ... -
linux安装memcached
2012-08-15 12:35 995所需软件: libevent-2.0.19-stable.t ... -
安装lilnux各分区大小推荐
2012-07-02 16:24 877ubuntu: /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数组长度...
标题"不改变长度删除数组中的元素"所涉及的知识点,实际上是在探讨如何在保持数组长度不变的情况下,移除其中的特定元素。这种情况下,通常我们会采用一种称为“稀疏数组”或“标记”的技巧来实现。 数组的长度是其...
在上面的代码中,我们创建了一个包含五个元素的一维数组`arr`,然后通过`length`函数得到其长度`len`,最后使用`disp`函数输出结果,显示数组的长度为5。 然而,当处理二维数组时,`length`函数的行为略有不同。它...
在结构体中定义一个零长度数组,例如`char bytes[0]`,可以视为结构体的结束标志,但其真正的目的是为了后续的数据扩展。 结构体零长度数组的主要用途是作为可变长度的数据存储区。例如,在上述的`user_def_t`...
本程序可以由用户确定数组的长度,再通过用户输入数组的值,遍历并打印出来
总结来说,Go语言通过内置的len()函数,为我们提供了简单且高效的方法来获取数组或切片的长度信息。掌握并熟练使用len()函数,对于编写高效且易于理解的Go程序是非常有帮助的。同时,len()函数在处理其他类型的长度...
在MATLAB中,处理数组是日常编程中常见的任务,了解如何获取数组的长度和维数对于数据分析和算法实现至关重要。MATLAB提供了内置函数来帮助我们快速获取这些信息。以下是关于如何在MATLAB中求解数组长度和维数的详细...
1. **接口参数定义**:当你在FC或FB的接口中使用变长数组时,应声明为`Array[*] of …`,而在调用时,实参应使用已知长度的具体类型数组。 2. **使用范围**:变长数组可在FC的Input和InOut参数,以及FB的InOut参数...
输入一个数组,数组的长度有用户输入,然后再一次输出数组的元素。
这段代码首先通过外层循环遍历`s`的所有元素,累加`data`字段的长度,然后预分配一个大小为`count`的`timestamp`数组,最后通过内层循环填充`timestamp`数组。 然而,你询问是否有不使用两次for循环的方式来执行这...
它首先初始化`sum`为0,然后使用一个循环从1开始,每次递增2(因为我们要找奇数长度的子数组),直到循环结束于数组长度`len`。在每次循环中,调用`windows`函数,传入当前的`i`(即窗口长度)和`arr`,并将返回的...
传统的C++数组在声明时需要指定其长度,而不定长数组允许我们在运行时根据需要分配和调整大小。这种特性使得程序更加灵活,能更好地适应变化的数据需求。 在C++中,实现不定长数组的方式主要有两种:使用`std::...
这将把数组元素都设置为 0。 const 对象的动态数组: 如果我们在自由存储区中创建的数组存储了内置类型的 const 对象,则必须为这个数组提供初始化。例如: ```cpp const int *pci_ok = new const int[100](); // ...
For Loop通常用于已知数组长度的情况,而While Loop适用于未知长度或动态变化的数组。 4. **条件判断**:在循环内部,添加一个Condition Structure(条件结构),检查当前元素是否为0。可以使用Equal To?函数,将...
此项实现了java数组不方便使用的优化,修护了数组不可更改长度的说话,面向对象的编程思想,小小提示可以当工具类使用
创建字节集 数组字节集, 长度 * 4 // 假设数组元素为整数,每个整数4字节 .循环 长度 .将 整数型 到 字节集 阵列元素[循环索引], 数组字节集, 4 // 将整数转换为字节集 .end循环 .写文件 “数组保存.txt”, 数组...
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
python python_leetcode题解之第961题在长度2N的数组中找出重复N次的元素
有很详细的注释,可以作为一维数组操作函数进行参考。操作可供选择。 int length(int *array); 返回数组元素个数 int copyarray(int *src, int *dest); 成功返回0, 失败返回-1 int printarray(int *array); 打印 ...