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

标签 c memory-management malloc

我想创建一个函数来生成任意长度的数据并返回数组。数据的内存将从数组中分配。我知道以下简单的测试代码完成了分配和返回指针的工作,但我不知道它是否安全,不会在稍后被 this 或其他函数的另一次调用覆盖。

#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 是泄漏内存的好方法的情况下)。

最佳答案

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

也就是说,还有两件事要提。

  1. 无需转换malloc()的返回值。
  2. 在使用返回的指针之前,始终检查 malloc() 是否成功。

此外,printf ("%d %d\n",a,b); 是错误的。您需要使用 %p 格式说明符来打印指针(内存地址)。

#感谢Mooing Duck先生的点评。

关于c - 使用 c 函数分配内存是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29132197/

相关文章:

c++ - 按升序从消息队列中读取数据

c++ - 错误 : Deallocating a 2D array

c++ - c++ 图数据结构的并发垃圾收集

c - 如何将字符中的值赋给指针?

c++ - 我如何在链接描述文件中使用存档中的目标文件?

objective-c - 如何将生成的数组从 c 函数返回到 objective-c

objective-c - 窗口关闭时释放 NSWindowController

c - C 动态分配如何与链接器一起定义堆位置

c - 获取分配的内存空间的特定长度的一部分

c - 初始化动态分配的整数