乘风破浪会有时,直挂云帆济沧海
导航
VC知识库BLOG
首页
新随笔
联系
聚合
登录
<
2010年3月
>
日
一
二
三
四
五
六
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
统计
随笔 - 23
文章 - 0
评论 - 76
引用 - 0
公告
欢迎大家与我联系, Email:hflaa123@yahoo.com.cn qq:156708864
留言簿(15)
给我留言
查看公开留言
查看私人留言
随笔分类
原创作品 (6)
(rss)
技术园地 (9)
(rss)
生活随笔 (8)
(rss)
随笔档案
2009年4月 (1)
2008年10月 (1)
2008年5月 (1)
2007年12月 (1)
2007年8月 (1)
2007年6月 (1)
2007年5月 (1)
2007年2月 (1)
2007年1月 (1)
2006年7月 (2)
2006年6月 (2)
2006年5月 (3)
2005年10月 (3)
2005年9月 (4)
文章分类
其他 (0)
(rss)
收藏 (0)
(rss)
文章档案
友情链接
张凯
林形省
王贤锋
胖哥
蔡少浦
诸辉
高博
相册
我的网易相册
搜索
最新评论
1. re: 角色转化,过去和现在
很同意你的说法!
--selva
2. re: 角色转化,过去和现在
爱情是两个人的事,但这绝不是用来埋怨对方的借口。爱情需要彼此付出,而这种付出是要从心底发出地去关爱对方。因为相爱,彼此了解;因为相爱,彼此温暖。
每个人都会有不足,我们要做的,不是拿对方的不足当把柄,而是要用自己的长处去弥补它,这样会让对方倍感爱的温暖。有的人总觉得自己付出的是最多的,大多吵架的,在这上总是斤斤计较,互不相让,让战争的硝烟每天弥漫在生活里,这样的爱情能让人不累吗?既然两个人在一起了,就不要太计较谁付出多一点,谁付出少一点?谁挣钱多一点,谁挣钱少一点?谁做家务多一点,谁做家务少一点?往往在你问谁爱谁多一点时,伤害的是两个人的心。两个相爱的人不能好好地生活在一起,大多是他们不懂得生活,不懂得怎样来经营爱情。
--july
3. re: 无题
左手厄...真有这么一说么,= =|| 回头反省去~!
--fumaria
4. re: 遗传算法简单示例
兄弟,这个有没有代码的啊?
--老蔡
5. re: lpc2104(ARM7内核)与s3c2410(ARM9内核)中断处理比较
感觉没什么不同
--网站建设
6. re: lpc2104(ARM7内核)与s3c2410(ARM9内核)中断处理比较
用过lpc2132,2132不支持“自动”中断嵌套,一度搞得我debug的很郁闷。
--hatemath
7. re: lpc2104(ARM7内核)与s3c2410(ARM9内核)中断处理比较
从具体的角度来说是philips 与 sumsung的区别,但是arm7与arm9有类似的区别,如s3c44b0也存在向量中断和非向量中断。
--HFL's Blog
8. re: ARM7(lpc2104)与ARM9(s3c2410)中断处理比较
难道他们的区别仅仅是arm7与arm9
的区别??????
或者是
philips 与 sumsang的区别?
--gaoqing000
9. re: ARM7(lpc2104)与ARM9(s3c2410)中断处理比较
有什么不同。?????????????
--gaoqing000
10. re: DM2410平台学习之数码管实验
顶。。正好学习ARM9中,刚好用的到。。。
--linux-arm
阅读排行榜
1. 我的代码管理器(已加入源码下载)(19268)
2. 计算机图形学几个简单算法的模拟(10090)
3. 年龄(9674)
4. 类似于FlashGet的悬浮框的制作(原文早期已发表在vckbase) (9359)
5. 用c#+asp.net制作的个人Blog源码(7280)
6. Huffman编码设计辅助工具(简单,但做了就传上来)(7002)
7. 还是lcd(6797)
8. 如何判断数组是静态还是动态分配的(逛论坛所见)(5930)
9. 二进制文件转为16进制表示的c数组代码,只作为保存之用(简单)(5872)
10. DM2410平台学习之数码管实验(5684)
评论排行榜
1. 我的代码管理器(已加入源码下载)(18)
2. 类似于FlashGet的悬浮框的制作(原文早期已发表在vckbase) (10)
3. 年龄(6)
4. 还是lcd(5)
5. lpc2104(ARM7内核)与s3c2410(ARM9内核)中断处理比较(5)
6. 计算机图形学几个简单算法的模拟(5)
7. 我是这样一个人(4)
8. 如何判断数组是静态还是动态分配的(逛论坛所见)(4)
9. DM2410平台学习之数码管实验(4)
10. 无题(3)
如何判断数组是静态还是动态分配的(逛论坛所见)
先贴代码:
#include
<
stdio.h
>
#include
<
stdlib.h
>
#define
SMALLER(a, b) ((a)>(b) ? (b) : (a))
#define
MIN(a, b, c) SMALLER(SMALLER(a,b), c)
#define
ABS(x) ((x) < 0 ? -(x) : (x))
void
test(
int
*
p)
{
int
x;
/**/
/*
x位于栈中
*/
static
int
y
=
1
;
/**/
/*
y位于静态区中
*/
static
int
*
q
=
(
int
*)malloc(
sizeof
(
int
));
/**/
/*
q所指向的内存位于堆中, q定义为static的是为了只malloc一次,否则容易造成内存碎片
*/
unsigned
int
u
=
ABS((unsigned
int
)q
-
(unsigned
int
)p);
/**/
/*
计算q与p间距离
*/
unsigned
int
v
=
ABS((unsigned
int
)
&
x
-
(unsigned
int
)p);
/**/
/*
计算q与&x间距离
*/
unsigned
int
w
=
ABS((unsigned
int
)
&
y
-
(unsigned
int
)p);
/**/
/*
计算q与&y间距离
*/
unsigned
int
s
=
MIN(u, v, w);
/**/
/*
求最小距离
*/
if
(p
==
NULL)
/**/
/*
sanity check
*/
{
printf(
"
test() in file %s: NULL pointer parameter.
"
, __FILE__);
return
;
}
if
(s
==
u)
{
printf(
"
p located in heap.
"
);
/**/
/*
与q最近,故p所指内存在堆中
*/
}
else
if
(s
==
v)
{
printf(
"
p located in stack.
"
);
/**/
/*
与&x最近,故p所指内存在栈中
*/
}
else
{
printf(
"
p located in data section.
"
);
/**/
/*
与&y最近,故p所指内存是静态分配的
*/
}
}
int
a[
100
]
=
{
1
}
;
int
main(
void
)
{
int
*
b
=
(
int
*
)malloc(
100
);
int
c[
100
];
test(a);
/**/
/*
测试静态内存
*/
test(b);
/**/
/*
测试动态内存
*/
test(c);
/**/
/*
测试栈内存
*/
free(b);
return
0
;
}
以下是该程序作者的解释:
利用各编译器处理变量和动态内存分配的公共策略,那就是分块处理,是最切实可行的办法。相信有经验的C/C++开发人员都不会否认以下事实:
1、编译器总是把程序中的静态变量集中分配在内存的低端,一般包括DATA区和BSS区。DATA区集中存放已初始化的全局变量。BSS区集中存放未初始化的全局变量,而且BSS区在可执行文件中只存放(相对)起始地址和长度信息以节省外存空间,只有在装入内存的时候才展开并全部初始化为0;
2、运行进程的地址空间布局:不考虑环境区、命令行参数以及代码区,按地址从低到高依次为静态区(包括DATA区和BSS区)+ 堆 + 栈。堆和栈共用进程的一大段高地址内存,分别用于存放程序动态分配的内存(比如malloc)和运行函数调用堆栈(其中包括当前函数的局部变量,返回地址,一些保存寄存器值等),但是堆的内存分配方式为为从低到高增长,而栈却是从高到低增长。
有了这种分析之后,我们不难得出如下结论“因为各种内存,无论是静态内存,动态分配的内存还是堆栈,它们分别都是成块集中存放的,相互之间没有交叉,所以对于任一个给定的合法内存地址p来说,它和同类地址a1之间的距离与它和异类内存地址a2之间的距离相比,总有下式成立:
|p-a1| < |p-a2|.
有了这个结论,我们就可以认为设置三个分别位于静态区、堆和栈中的变量,通过它们的地址分别与用户传入的地址(比如q)进行比较,其中离q最近的那个变量所在的区块也就是q所在的区块,以此判断q是静态分配的,动态分配的还是局部数组。
posted on 2005-09-30 23:08 HFL's Blog 阅读(5930)
评论(4)
编辑
收藏
Comments
#
re: 如何判断数组是静态还是动态分配的(逛论坛所见)
freedk
试试~~~~~~~
Posted @ 2005-09-30 23:32
#
re: 如何判断数组是静态还是动态分配的(逛论坛所见)
清风雨
Is it important ?
I am very sad of this.
We should never make it a skill i think, and you?
Posted @ 2005-10-01 12:49
#
re: 如何判断数组是静态还是动态分配的(逛论坛所见)
arong
首先同意清风雨,这不重要
其次:对于操作系统的任何假设,都是危险的。不依赖于操作系统的内部实现的程序才是安全的。
另外:堆的分配方向和栈的分配方向和这个问题有关么?我相信是对“方向”有误解吧?这个方向和该问题没有关系。
说一个极限情况,假设一个程序特殊处理,一块内存分配在堆的边界,和附近的堆栈很接近,这样你的判断是不是可能错误?
用一个可能是瑕疵的算法进行一个毫无意义的操作,恐怕对程序设计只有害处,没有好处。
Posted @ 2005-10-02 22:54
#
re: 如何判断数组是静态还是动态分配的(逛论坛所见)
Diviner
看在哪个段上估计就可以了吧?
Posted @ 2005-10-03 15:08
标题
姓名
主页
验证码
*
内容
Remember Me?
登录
使用高级评论
Top
[使用Ctrl+Enter键可以直接提交]