The power of C, the power of MD

A problem is a chance to do your best
posts - 11, comments - 22, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
@普派

It didn't work. Therefore, I had to find other ways.
@毛毛

谢谢你,不过我写本节之前已经试过了,不OK
@hoodlum1980

首先感谢你一直关心拙作,我们都是技术人员,关于技术问题没什么不能谈的,是吗?

其次,我并没有用string_append代替strcat的意思,事实上,通常情况下,我都只用strcat,只有在strcat对效率影响实在太大的时候,才考虑string_append。这个例子中直接用strcpy当然可以,但还是需要strlen计算附加串的长度。
不用自己写那么麻烦,请参考我的博文,同样可以移植到windows环境下

http://blog.csdn.net/yui/archive/2010/06/13/5669922.aspx
@www

明白了,谢谢你
@www

这样啊,但是我在别的地方看到这段话,好像GPL并不意味着要收费呀

使用GPL协议的代码制作的程序并非不能拿来卖钱,事实上RMS开始自由运动的第一笔经费就是通过售卖附在磁碟上的Emacs赚来的。GPL的主要规定在于源代码必须自由公开。

http://www.linuxdiyf.com/viewarticle.php?id=179559
@hoodlum1980

唉,我反而觉得你没理解好,你是说每次调用string_append都要先调用strlen吗?根本不需要,每次string_append就已经计算了下一次执行时的偏移量了
@right

此话怎讲?
@hoodlum1980

这个例子中,从来没用到strlen,而且,这是在某种特定条件下的优化,初始值是空串,长度为0,请看清楚
@roy

好像我有点过时了
刚才分别在Linux/Solaris/Tru64/HP-UX下测试这段代码N次,每次输出都是0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *tmp = (char *) malloc(1024 * sizeof(char));
printf("%d\n", strlen(tmp));
free(tmp);
return 0;
}

char* temp = (char*)malloc(67 * sizeof(char));
Int leng = strlen(temp);
Memset(temp,0,strlen(temp));
Leng = strlen(temp);
两次leng的值是不一样的,第一次是正确的值,第二次是0;strlen找的是’\0’,但是不包括’\0’;

strlen遇‘\0’结束,所以,在未memset之前,分配的内存块都是随机值,有可能是0,第一次有可能不是固定的值
bool IsLoop(node *head)
{
...
while(p!=NULL&&q!=NULL&&p!=q)
{
p=p->next;
tmp=q->next;
q=tmp->next; // core dump here! if tmp == NULL
}
...
}
来学习一下思路先~
@lwch

原始的strcat一样会溢出,这个问题应该由调用者负责
re: 告别的话 Roy 2010-06-25 10:16
我x,你要去哪?
可以更新为word文档吗?方便打印