它是在堆栈还是堆上吗?

5

我有一些C代码,它有点像一个谜题。由于这个代码的原因,我想知道如何判断一个struct对象是否最终位于堆栈或堆上?

这些对象不是使用malloccalloc创建的。它们以数组的形式开始它们的生命周期。为了本文的目的,我将称这个结构体为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语言了解不够。

非常感谢您的帮助。


3
经验法则:如果你调用了malloc,你必须调用free。相反地,如果你没有调用malloc,你就不应该调用free,尽管通常如此。(一些函数会为你调用malloc,如果是这样,在函数的文档中应该用大红字明确说明。) - Roger Pate
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个不同位置的地址。

是的,连同全局声明的东西一起。 - Mehrdad Afshari
那么你的意思是在我上面的例子中,所有东西都最终进入堆栈。没有任何东西可能进入堆吗? - Frank V
4
C语言非常明确。如果你没有使用malloc()函数,它就不在堆上。 - John Kugelman
1
确实。在C中,就是这样的。C++可能会运行构造函数,这些构造函数最终可能会将一些东西放在堆上。 - Mehrdad Afshari
1
无论你在函数体中静态声明什么,都会分配到堆栈上 - 这是垃圾,需要编辑才能被接受。无论你在函数体中非静态声明什么,都会分配到堆栈上... - Windows programmer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接