我想创建一个能生成任意长度数据并返回数组的函数。数据的内存将从数组中分配。我知道下面的简单测试代码会分配和返回指针,但我不知道的是,如果以后通过另外调用此函数或其他函数来覆盖它是安全的。
#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是泄漏内存的好方法)。
答案 0 :(得分:7)
是的,分配动态内存并将指针返回给调用者函数是安全的。由于动态内存分配器API [malloc()
和family]从全局堆“对象”获取内存,因此即使在不同位置的调用也不会分配相同的内存或重叠,因为它们都使用全局协调堆“对象”。因此,除非您free()
记忆,否则任何其他对malloc()
/ calloc()
的调用都不会再分配该记忆。
那说,还有两件事要提。
malloc()
。malloc()
是否成功。另外,printf ("%d %d\n",a,b);
错了。您需要使用%p
格式说明符来打印指针(内存地址)。
#感谢Mooing Duck先生的评论。