5

我有一些令人困惑的 C 代码。出于与此代码有关的原因,我想知道如何判断一个struct对象是在堆上还是在堆栈上?

对象不是malloc或创建的calloc。他们以数组的形式开始他们的生活。出于本文的目的,我将调用 struct Emp。

Emp myEmp[6];

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

以各种方式对对象进行排序和操作,在某些时候,对象被复制然后交给数组指针。复制是通过memcpy. 然后将对象放入以下内容中:Emp* emps_a[6].

对象来自副本并分配到上述emps_a。

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

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

非常感谢您的帮助。

4

1 回答 1

17

除了全局变量和使用static修饰符声明的变量(分配在单独的内存区域中)之外,在函数体中声明的局部变量在堆栈上分配,而您调用malloc的任何内容都在堆上分配。此外,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 个不同位置的地址。

于 2009-06-29T03:27:48.873 回答