友情链接
· 歪酷博客
· 管理我的Blog
· 我拍的照片
· <- Technical Guys ->
· 惊帆之静默
· <- Technical Guys ->
· <! --- Dude Start Here ---!>
· 多儿
· 洪七公的直接
· 科大吴老师
· 维C周星星
· 民工土人男
· 小猪土人女
· 闺中贝贝赵
· 女经纪范^_^
· 甜甜的老鼠
· 嗔!一群土人
· 佳佳的水云间
· micheal@uestc
· 摇滚女青年
· lyker@uestc
· JalenWoo@uestc
· plan@uestc
· 帅哥包同学
· 阿楠@uestc
· cicy小朋友
· 翠花的酸菜
· 终于承认是小资
· rice@uestc
· J@WING@uestc
· 咨询业的付毒人
· 丁珊珊同学
· 我的徒弟
· 五弟面爷
· 科大人文办周总
· <! --- Dude End Here ---!>
· <! --- Bookmark Start Here ---!>
· LWN
· Wikipedia
· ScienceWorld
· Public Library of Science
· <! --- Bookmark End Here---!>

Perpetuum Vestigium

一花一世界,一叶一乾坤。


« 上一篇: Solutions to SICP Exercises 下一篇: 只看许不说 »
kaby @ 2006-10-16 10:24

1.structhack
Have you ever seen a struct definition like this

struct pack{
    unsigned short count;
    unsigned long id;
    unsigned char data[1];
};

从前我喜欢申请一统一的buffer,在struct定义一指针,
进而实现边长数据的携带,譬如

struct comm{
    unsigned short count;
    unsigned long id;
    unsigned char *data;
};

/*code start here*/
void init()
{
    char *buff, *c;
    c = buff = malloc(MAX_SIZE);
    return;
}

void add()
{
    struct comm *s;
    s = malloc(sizeof(*s));

    s->data = c;
    c += DATA_SiZE;
    return;
}

以上方法最大的弊病是涉及到buffer的管理,当申请释放频繁时,
不多久buffer就是一片狼藉了。
于是有了structhack,把以上问题转嫁给现存的完善的堆机制处理。
其基本流程如下

struct hack{
    unsigned short count;
    unsigned long id;
    unsigned char data[1];
}

struct add()
{
    struct hack * h;
    h = malloc(sizeof(*h) + DATA_SIZE - 0x01);
    memcpy(h->data, data, DATA_SIZE);
    /* Now, You are available to handle h->data as a actual array with DATA_SIZE elements */
}

很明显,这种机制下边长数据的申请是释放都交由管理,且代码操作依然简单明了,完全等同于一个数组。
Futher Reading:[http://c-faq.com/struct/structhack.html]

2.Should you cast when malloc()?

char *str;
str = (char *)malloc(strlen(STRING) + 1);

Is this right? I do not think so.
很多人喜欢这么写,包括我自己;但是此般casting会隐瞒可能的BUG。
譬如当忘记引用stdlib.h时。
要知道对于一个未申明的函数,ANSI C标准中定义的操作是“认为其含有一个隐式的extern申明“。
也就是说,在没有包含stdlib.h的情况下,编译器会自动定义其为extern int malloc()。
问题就在于此,实际上malloc()的原型是void *malloc(),且.lib中的binary的压栈出栈代码亦是按
照该原型编译。一个int被赋值到char *,且如果强制类型转化操作存在,编译过程不会有任何警告。

这里有一篇相关文章[http://www.cpax.org.uk/prg/writings/casting.php],其观点认为在绝大多数
情况下切勿使用强制类型转换-于排错无益、对可读性也改善甚微。




评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定

网志分类
· 所有网志 · 壹家杂谈 · Tech. et Sci. · Paper Reader · 未分类 ·
站内搜索

订阅 RSS

0056215

歪酷博客