使用realloc
是完全安全的。这是C程序中重新分配内存的方法。
然而,您应该始终检查返回值以检测错误条件。不要陷入这种常见陷阱:
p = realloc(p, new_size); // don't do this!
realloc
失败,会返回NULL
,你将无法访问p
。因此请使用以下方式:new_p = realloc(p, new_size);
if (new_p == NULL)
...handle error
p = new_p;
realloc
的实现只是做一个malloc
,memcpy
,free
的操作。这使得realloc
变得不太有用... - unixman83这是一个可能有效的观点,但并不是对 realloc()
本身的批评; 如果你使用了 malloc()
+复制+free()
,同样会发生这种情况。真正的解决方法是合理地增长缓冲区,而不管如何增长它们或最好一开始就分配正确大小的块。
他们也有一些关于
使用 realloc 将内存返回给系统。
他们在这里是正确的,因为使用任何非零大小可能实际上不会使其返回。这可能不会使事情变得更糟,但是这种用法仍然看起来像是过早的“优化”的例子。解决方法仍然是使用合理的大小分配开始。
简而言之:它并不是不安全的,但它也不是解决所有问题的神奇解决方案。
realloc
本身是安全的,但要安全使用它有点棘手——我会说大约85-90%的代码在使用它时都不安全。问题在于realloc
返回NULL表示失败,但当它这样做时,你提供的指针仍然是有效的(前提是你没有将其分配大小调整为0)。
因此,只有当realloc
返回非空指针时,你才需要将其返回值赋给你提供的指针。如果它返回null指针,则你之前的指针仍然有效,但分配未被调整大小。
另外请注意,许多人认为只有在增加分配时realloc
才可能失败和/或移动分配。实际上,即使在减小分配大小时,它也可能失败(虽然这不太可能)或将数据移动到其他位置(更有可能)。
就像 C 语言中的所有内容一样,只要你知道自己在做什么,就没问题。
(知道自己在做什么包括检查错误、不使用旧指针等)
gets
是永远不好的。当然,严格来说,现在C11已经成为了“C语言”,所以gets
不再是“C语言中的”了。 :-) - R.. GitHub STOP HELPING ICE
malloc
和realloc
永远不会失败。相反,如果你的内存用完了,程序就会崩溃。 - unixman83