2010-07-22 75 views
4

我刚开始学习C和(当然)与指针:)指针最佳实践

挣扎鉴于此片段:

int *storage, *storage_p; 
storage = malloc(sizeof(int[GROW_BY])); 
storage_p = storage; 
// do something with storage, using storage_p 
free(storage); 
storage = NULL; 

是否真正有必要声明的两个变量一起工作malloc()'ed数据?按照我的方式创建storagestorage_p是不是很好?如果不是,那么'这样'会是什么?

+0

不完全是你的问题,但它*是一个很好的习惯来清空你已经释放的指针,或者你知道你不需要从这段代码中再次使用。 – ndim 2010-07-22 19:13:01

+0

当两个指针指向相同的内存并释放一个内存时,代码是危险的。 – 2010-07-22 19:14:16

+0

@ndim:我知道,我已经阅读过有关指针的每一个参考文献,这是非常清楚的说明!编辑:我现在看到你的意思是我也应该NULL storage_p,我会的! – 2010-07-22 19:15:39

回答

3

您将需要一个指针,将举行)通过的malloc(返回的值,所以你可以稍后释放它。

如果你计划使用storage_p将会改变它的值,那么你将需要两个指针。

但是,我通常保持纯初始指针,并创建新的,特设的,因为我需要一个。

int *storage = (int*) malloc(sizeof(int[GROW_BY])); 
// : 
int* ptr = storage; 
while (*ptr) 
{ 
    // : 
    ++ptr; 
} 
+0

这就是我的情况。我在一个循环中使用了“存储”(递增),当我调用'free()'时,我得到了段错误。我想我的描述不够清楚。因此,回顾一下,除非必须修改指针,否则通常不会创建副本。那是对的吗? – 2010-07-22 19:13:29

+0

这是正确的。 – 2010-07-22 19:15:29

+0

谢谢,这些都是一些好的指针;) – 2010-07-22 19:20:44

1

我会建议不要有指针的副本。它只会增加随意使用悬挂指针的机会,您可能会稍后意外使用它,或者增加一个额外的副本,但这些额外的副本可能并不是免费的,或者是您可能不希望双倍使用的额外副本。我不认为在这里需要storage_p

GOOL“醇:

int *storage = malloc(size_of_whatever); 
storage[0] = do_something(); 
free(storage); 
storage = NULL; 

就可以了。

1

不,我不明白你在哪里通过storagestorage_p获得任何东西。我通常只有其中一个。

0

这对我来说似乎没有必要。我不确定中间部分可能是什么,但我看不到任何有利于别名的指针 - 除非你正在修改storage_p(例如,递增它来迭代)。事实上,拥有两个别名指针可能会让跟踪分配的内存变得更加困难。

2

我只会复制一个由malloc创建的指针,原因有一个:我想修改它。

例如,如果您正在迭代通过malloc分配的字符数组,我会将指针复制到一个新变量以迭代并保持第一个变量不变。

而且,当涉及到动态分配,看看免费名单,它们可以简化很多:

http://en.wikipedia.org/wiki/Free_list

+0

谢谢,我会研究他们。 – 2010-07-22 19:14:31

1

你可能想这样做的原因是因为你做storage几个操作后,你可能不记得什么free()。有storage_p作为副本,你永远不会修改有助于防止内存泄漏,因为你可以稍后调用free(storage_p),无论storage发生了什么。这是否超过已经提到的缺点取决于具体情况。

一个例子:

int *storage; 
storage = malloc(sizeof(int[GROW_BY])); 
storage++; 
free(storage); //SEGFAULT or MEMORY LEAK or OTHER BAD STUFF 
storage = NULL; 

VS

int *storage, *storage_p; 
storage = malloc(sizeof(int[GROW_BY])); 
storage_p = storage; 
storage++; 
free(storage_p); 
storage_p=NULL; 
storage = NULL; 
0

没有内在原因重新分配其malloc分配到另一个指针的空间。

如果有的话,它会只是不必要地添加线条和妥协的可读性。