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) |