我想创建一个函数来生成任意长度的数据并返回数组。数据的内存将从数组中分配。我知道以下简单的测试代码完成了分配和返回指针的工作,但我不知道它是否安全,不会在稍后被 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 再次分配()
。
也就是说,还有两件事要提。
- 无需转换
malloc()
的返回值。 - 在使用返回的指针之前,始终检查
malloc()
是否成功。
此外,printf ("%d %d\n",a,b);
是错误的。您需要使用 %p
格式说明符来打印指针(内存地址)。
#感谢Mooing Duck先生的点评。
关于c - 使用 c 函数分配内存是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29132197/