int *getAr()
{
int *a;
int i;
a=(int*)malloc(sizeof(int)*10);
for(i=0;i<10;i++)
a[i]=i;
return(a);
}
int main()
{
int *a;
int i;
a=getAr();
for(i=0;i<10;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
OUTPUT是:
0 1 2 3 4 5 6 7 8 9
答案 0 :(得分:5)
当你malloc()
时,内存将从堆中获取。函数返回时不会卸载(与堆栈不同)。
答案 1 :(得分:2)
其他人已经指出了原因,再加上几点帮助。
本地/自动变量的范围在函数调用中,而不在任何其他函数中。
但是在这里,你将返回指向动态分配内存的指针,在函数调用之后不会释放它,这就是程序工作正常的原因,尽管存在内存泄漏。
您必须明确调用 free()来释放使用malloc()分配的内存。
我认为你在这种情况下感到困惑:
// When the array is on the stack:
int *getAr() {
int b[10]; // 'b' allocated on stack
int *a = b; // 'a' allocated on stack
return (a); // or return (b);
}
void main () {
int * a = getAr();
printf("%d \n", a[0]); // this may not give you the correct result
}
关于堆栈和堆的好教程将帮助您:
答案 2 :(得分:0)
它的值可以在main函数中访问,因为它是堆分配的。堆分配的数据可以被程序中的任何函数访问,而堆栈分配的数据只能由于堆栈卸载而创建它的函数访问。
来源:http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html#sec-3
答案 3 :(得分:-1)
在C中不允许返回指向自动局部变量的指针,因为一旦函数返回它就不存在
否则返回指向static
局部变量的指针和允许动态分配的变量。