代码之家  ›  专栏  ›  技术社区  ›  Frank V

它是在堆栈上还是堆上?

  •  5
  • Frank V  · 技术社区  · 17 年前

    我有一些C代码,这是一个谜。出于处理此代码的原因,我想知道如何判断 struct 最后是堆还是堆栈?

    对象是 malloc calloc . 他们以阵列的形式开始他们的生活。在本文中,我将调用struct Emp。

    Emp myEmp[6];
    
    /* Each myEmp[?] item is populated in code */
    

    对象以各种方式进行排序和操作,在某一点上,对象被复制,然后交给数组指针。副本通过以下方式完成: memcpy . 然后将这些对象放入以下对象: Emp* emps_a[6] .

    这些对象来自副本,并被分配到上述EMP_a。

    int i;
    for( i = 0; i < n; i++ )
    {
        emps_a[i] = myEmpsCopy + i;
    }
    

    我不确定这些是否与我的问题有关。我从不需要空闲()或清理内存。。。恐怕我对C不太了解。

    非常感谢你的帮助。

    1 回复  |  直到 5 年前
        1
  •  17
  •   Mehrdad Afshari    17 年前

    保留全局变量和用声明的变量 static 除了修饰符(在单独的内存区域中分配)之外,函数体中声明的局部变量在堆栈上分配,而不管您调用什么 malloc for在堆上分配。此外,C99可变大小的阵列和分配给 _alloca 将以堆栈结束。

    int* x[10];   // The addresses are held on the stack
    int i;        // On the stack
    for(i = 0; i < 10; ++i)
       x[i] = malloc(sizeof(int)*10);  // Allocates memory on the heap
    

    例如,在上面的代码中,有一个 int* 堆栈上的值将地址保存到堆中的10个不同位置。