我有两个指点:
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);
或者它是非法的?
答案 0 :(得分:1)
您正在执行的操作会导致您为a
分配的内存泄露。这意味着你丢失了存储在内存中的信息,因为你用b
覆盖了指针。如果你想像你一样分配指针,你自己提出的解决方案
free(a);
a=b;
free(b);
会奏效。但请记住,在释放b
后,a
指向无效位置,因为您释放了内存。因此,访问a[0]
会导致程序崩溃。
答案 1 :(得分:1)
在您的示例a=b
中创建内存泄漏。先前由a
指向的内存块变得无法释放,因为您的程序不再具有指向它的指针。这可能不会立即导致问题,但随着时间的推移,您的程序内存不足,malloc
开始返回NULL
。
在重新分配之前调用free(a)
可修复此问题。分配a=b
后,您需要在调用a
后小心使用free(b)
,因为a
会成为悬空指针。
如果
,会有所不同吗?a
是全局的且b
是本地的吗?
指针的范围在这里无关紧要。必须独立于指针所指向的存储器块来考虑指针。该块分配在动态存储器中;指向块的指针可以是任何地方 - 静态,自动或动态。
答案 2 :(得分:1)
执行a=b
时,a
指向b
指向的数组。然后,您想要释放的唯一内存是a
最初指向的数组。为此,
free(a);
a=b;
在这里,您将a
指向的内存释放,并使a
指向b
指向的内存。如果您第一次执行a=b
,则a
指向b
指向的数组,但无法访问先前{{1}指向的内存}}。所以,你应该先释放a
。此外,如果您稍后释放a
,则只剩下b
和a
指向NULL的所有内容。