我想创建一个为指针(从main)分配空间的函数。如果在函数中分配了内存,则该函数返回后,该内存是否仍然可用并且可以安全使用?这是代码示例:
int foo(int **number)
{
*number = (int*)malloc(sizeof(int));
}
int main()
{
int *myVar;
foo(&myVar);
}
因此,我们看到在执行foo()
函数的过程中分配了内存。
myVar
变量的存储空间将分配在foo()
函数的“空间”还是main()
的“空间”中?
完成foo()
的执行后,将清除其内存。 myVar
会指向相同的“空格”吗?使用安全吗?
是否可以被其他函数或变量声明覆盖?
答案 0 :(得分:2)
否,在foo
末尾不会清除或释放内存。是的,您在myVar
中的指针main
会正确指向您在foo
中分配的内存。 (顺便说一句,您不需要显式强制转换为int *
。
动态内存的全部目的是克服“作用域”,“功能”等施加的所有生命周期规则。由malloc
分配的内存独立于任何功能及其“空间”而存在。该内存将一直保留,直到您自己手动取消分配它为止。只要程序运行,动态内存(即免费存储,即堆)就会持续存在。
还请注意,您没有分配“指针空间”。您正在分配指针将指向的无名内存块。该块独立于任何指针而存在。您可以有一百个指针指向同一个块,或者根本没有。
答案 1 :(得分:0)
函数特有的是局部变量,它本身可以是指针。这些变量存在于堆栈中,并通过函数的范围(即-当函数退出时)进行清理。
但是,当使用malloc
/ calloc
分配内存时,分配的区域在堆中,这与函数的生命周期无关。返回指向该存储区的指针,该指针是某个函数或main
本身范围内的变量。就您而言-int *myVar
。
因此,只要您的进程在任何地方运行获得的指针(使用malloc
/ calloc
)都是有效的(除非您有意释放它)。
要确保可以访问存储区,需要使用pass by reference或返回指针本身。