指针最佳实践

时间:2010-07-22 19:03:10

标签: c pointers

我刚刚开始学习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是一种好习惯吗?如果没有,那将是什么“方式”?

7 个答案:

答案 0 :(得分:3)

您将需要一个指针来保存malloc()返回的值,以便您以后可以释放它。

如果您打算使用storage_p来改变它的值,那么您将需要两个指针。

但是,我通常保留纯粹的初始指针,并根据需要创建新的指针。

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

答案 1 :(得分:2)

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

例如,如果你在使用malloc分配的字符数组进行迭代,我会将指针复制到一个新的变量来迭代并保持第一个不变。

另外,在动态分配方面,请看一下免费列表,它们简化了很多:

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

答案 2 :(得分:1)

我建议不要有指针副本。它只是增加了你可能会在以后意外使用的悬空自由指针的机会,或者你可能并不意味着免费的额外副本,或者你可能并不意味着双重释放的额外副本。我个人认为这里不需要storage_p

Gool'ol:

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

没关系。

答案 3 :(得分:1)

不,我没有通过storagestorage_p获得任何收益。我通常只有其中一个。

答案 4 :(得分: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;

答案 5 :(得分:0)

这对我来说似乎没用。我不确定中间部分可能是什么,但我看不出像这样对指针进行别名的任何好处 - 除非你修改storage_p(例如,将它递增到迭代)。实际上,有两个别名指针可能会使跟踪分配的内存变得更加困难。

答案 6 :(得分:0)

没有内在的理由将malloc的空间重新分配给另一个指针。

如果有的话,它会不必要地添加线条并降低可读性。