Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111793
  • 博文数量: 23
  • 博客积分: 1546
  • 博客等级: 上尉
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-18 19:47
文章分类

全部博文(23)

文章存档

2012年(1)

2011年(6)

2010年(3)

2009年(13)

我的朋友

分类: C/C++

2009-05-19 10:07:08

1:

描述一种情景:

malloc分配内存给一个指针p时,另一个指针q对其进行再次引用时。

这时候经常发生的BUG是,一个指针free掉对应的内存并且解引用,而另一个指针却仍然对其访问其指向的内存。

demo1:

func(char *q)
{
    ... // 访问q指向的内存

    free(q);
    q = NULL; // 解引用

    ...
}

int main()
{
    char *p = (char *)malloc(24);
    ...
    func(p);
    ...
    free(p);
    p = NULL;
}

注:这个demo很简单,也很容易发现bug--两次free。

demo2:

func(char *q)
{
    ... // 访问q指向的内存
    q = realloc(q, 36);
    ...
}

int main()
{
    char *p = (char *)malloc(24);
    ...
    func(p);
    ...
    free(p);
    p = NULL;
}


注:这个demo就不容易看出来了,也是我经常犯的错误:主要是那个realloc,兄弟们在用的时候必须注意它很可能会改变以前指针的指向。这种情况下,以前指针对原先内存的引用已经失效,因为已经由realloc free掉了

2:strncpy(dest, src, n) 与 snprintf(dest, n, src)
假设你在合法的使用这两个函数(dest有足够的缓冲,且src与dest都是标准的字符串),你会在不经意间,发现如下不同:
strncpy会从src中复制n个字符到dest指向的buf中,如果n小于src的长度,那么dest[n] != '\0',
如果n大于src的长度,那么dest[strlen(src)]...dest[n]都等于'\0'.
而snprintf会从src中尽力(除非遇到'\0'字符)取n-1个字符复制到dest中,然后会在对dest[n]赋'\0'。


阅读(715) | 评论(0) | 转发(0) |
0

上一篇:生活的态度

下一篇:If--by Rudyard Kipling

给主人留下些什么吧!~~