为什么在函数' getAr'中定义局部变量?主要是访问?

时间:2014-07-16 17:00:46

标签: c

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

4 个答案:

答案 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
}

关于堆栈和堆的好教程将帮助您:

http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

答案 2 :(得分:0)

它的值可以在main函数中访问,因为它是堆分配的。堆分配的数据可以被程序中的任何函数访问,而堆栈分配的数据只能由于堆栈卸载而创建它的函数访问。

来源:http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html#sec-3

答案 3 :(得分:-1)

在C中不允许返回指向自动局部变量的指针,因为一旦函数返回它就不存在 否则返回指向static局部变量的指针和允许动态分配的变量。