使用c函数分配内存是否安全

时间:2015-03-18 20:39:24

标签: c memory-management malloc

我想创建一个能生成任意长度数据并返回数组的函数。数据的内存将从数组中分配。我知道下面的简单测试代码会分配和返回指针,但我不知道的是,如果以后通过另外调用此函数或其他函数来覆盖它是安全的。

#include <stdio.h>

float* CreateFloatArray(unsigned int N) {
    float *array = (float*) malloc(N*sizeof(float));
    return array;
}

int main() {
   float *a = CreateFloatArray(10);
//   free(a);
   float *b = CreateFloatArray(10);

   printf ("%d %d\n",a,b);
   return 0;
}

为了清楚起见,这段代码不是我的实际应用,而是一个简单的测试。

最后,测试代码打印两个已分配内存块的地址。如果我在两个调用之间插入free(a)命令,则a和b的地址相同;否则,他们相距甚远。

很明显,这个简单的测试工作在分配不同的内存块,没有重叠,但我正在寻找保证,从更有知识的人,在整个程序的执行过程中永远不会有内存重叠,无论如何很多次我称这个功能? (当然,了解到函数中的粗心malloc是泄漏内存的好方法)。

1 个答案:

答案 0 :(得分:7)

是的,分配动态内存并将指针返回给调用者函数是安全的。由于动态内存分配器API [malloc()和family]从全局堆“对象”获取内存,因此即使在不同位置的调用也不会分配相同的内存或重叠,因为它们都使用全局协调堆“对象”。因此,除非您free()记忆,否则任何其他对malloc() / calloc()的调用都不会再分配该记忆。

那说,还有两件事要提。

  1. 无需转换malloc()
  2. 的返回值
  3. 在使用返回的指针之前,请务必检查malloc()是否成功。
  4. 另外,printf ("%d %d\n",a,b);错了。您需要使用%p格式说明符来打印指针(内存地址)。

    #感谢Mooing Duck先生的评论。