重新指定指针后分配内存

时间:2016-08-13 10:36:31

标签: c arrays pointers memory

我有两个指点:

1

double *a, *b;
a = (double *) malloc (N*sizeof (double));
b = (double *) malloc (N*sizeof (double));

指向我使用malloc分配的巨大内存空间。并指定值。

然后,如果我这样做,

a=b;

a指向数组b指向。

分配给一个内存会发生什么?遵循更好的选择:

free(a);
a=b;
free(b);

或仅

a=b;
free(b);

或a = b;     免费的(a);

或者它是非法的?

  1. 如果a是全局的并且b是本地的吗?

3 个答案:

答案 0 :(得分:1)

您正在执行的操作会导致您为a分配的内存泄露。这意味着你丢失了存储在内存中的信息,因为你用b覆盖了指针。如果你想像你一样分配指针,你自己提出的解决方案

free(a);
a=b;
free(b);

会奏效。但请记住,在释放b后,a指向无效位置,因为您释放了内存。因此,访问a[0]会导致程序崩溃。

答案 1 :(得分:1)

  1. 在您的示例a=b中创建内存泄漏。先前由a指向的内存块变得无法释放,因为您的程序不再具有指向它的指针。这可能不会立即导致问题,但随着时间的推移,您的程序内存不足,malloc开始返回NULL

  2. 在重新分配之前调用free(a)可修复此问题。分配a=b后,您需要在调用a后小心使用free(b),因为a会成为悬空指针

  3.   

    如果a是全局的且b是本地的吗?

    ,会有所不同吗?

    指针的范围在这里无关紧要。必须独立于指针所指向的存储器块来考虑指针。该块分配在动态存储器中;指向块的指针可以是任何地方 - 静态,自动或动态。

答案 2 :(得分:1)

执行a=b时,a指向b指向的数组。然后,您想要释放的唯一内存是a最初指向的数组。为此,

free(a);
a=b;

在这里,您将a指向的内存释放,并使a指向b指向的内存。如果您第一次执行a=b,则a指向b指向的数组,但无法访问先前{{1}指向的内存}}。所以,你应该先释放a。此外,如果您稍后释放a,则只剩下ba指向NULL的所有内容。