LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: darksun

简单的从一个buffer中提取word的编程

[复制链接]
发表于 2003-9-11 11:47:16 | 显示全部楼层
最初由 quanliking 发表
感觉 theseus 兄那段代码写的很棒。
比较欣赏采用 struct 和 calloc() 动态内存分配。
有几点不明,何为 static 带来的不可重入性?
还有 calloc() 把数据都散布在不连续的堆上,找起来个人估计比连续存放显得要麻烦写,能具体讲讲好处吗?

通常在多个模块中,调用到一半的时候就容易出现问题,也包括多个线程中。
比如我们所说的strtok就用了static的buffer.你写了一个模块,使用strtok (buf, "\n\t")开分割buffer.
然后用strtok (NULL,"\n\t")来依此获取各个子段,
对不同的子段进行处理。举个例子:
"192.168.0.1-192.168.0.3;192.168.0.1/24;202.118.66.7"
要根据";"符号分出每个IP地址项,然后根据每个子项的内容提取相应的部分。象第一个就是网段IP,它的两个IP地址是"-"分割的。
如果在取出第一个子段以后重新调用strtok(xxxx,"-")来分割它,那么先前你用的strtok就丢失了,解决这样的办法之好用strtok_r来解决。

另外一种情况,在多个线程同时调用一个使用了内部static变量的时候也会出现问题:比如:
  1. char* foo ()
  2. {
  3.         static char* p = buf;
  4.         ......
  5.         p ++;
  6.         return p;
  7. }
复制代码
在线程1执行到.....的时候,另外一个线程2也要使用foo函数, 这样会出现什么后果????

我不太赞成在一些通用的函数里面使用staic变量,这样在以后程序增加功能以后,维护起来非常困难。
但是对于一个程序全局唯一的变量,用static来限定还是非常方便的,在多线程的情况下,复杂的static变量最好还是按照需要加上锁。

calloc malloc 在多次使用(这个多次不是指几十万次的数量级,至少要数亿亿次以上)以后,不可避免导致内存的碎片。所以很多大的程序通常在自己的临时内存分配上重新做一次
动态分配的包装,在程序一启动就申请一定数量的内存作为程序内部模块使用的临时内存。
另外的办法是使用alloca函数,这个函数是在函数的调用栈上动态分配内存,函数返回以后,alloca申请的内存随着调用栈的释放被自动释放,这样可以减少一些麻烦,但是这样的局限性是不能申请太大的内存,因为栈贞的大小通常是有大小限制的,这在一些嵌入式系统上尤其严重。比如uclinux的栈贞大小的限制就是1k。除了传递参数所需要的大小以外,省下的就没有多少了。
总之,按照需求办事,写程序没有一个十全十美的一成不便的模式,但是还是有很最优方法的。
发表于 2003-9-11 18:27:34 | 显示全部楼层

to quanliking

kao,天下大乱了,快回irc
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表