将malloc的变量值分配给新变量,也是堆内存上的新变量?

时间:2014-04-09 04:56:39

标签: c memory heap

我对以下新变量“num2”是否也在堆内存上感到困惑,因为我为其分配了“num1”值,并且num1被分配给堆内存。

int main()
{

    int *num1 = malloc(sizeof(int)); /* assign num1 to heap memory */
    *num1 = 7;

    int num2 = *num1;               /* assign num1's value to num2, is num2 also on heap?*/


    return 0;
}

4 个答案:

答案 0 :(得分:2)

无论何时使用malloc内存都在堆中分配(如果内存可用)。

在你的情况下,num1malloc时堆中内存的指针。 (num1指针仅存在于堆中。)

int num2 = *num1;

当您使用上述声明时,您所说的是num1指向的任何值,指定num2

int num2表示您希望在堆栈中为当前堆栈帧创建内存。

要在没有malloc的情况下分配内存,您可以尝试globalstatic。它将在Data segment的编译时为其分配内存。但堆不能按照我的知识直接分配

例如获取全局变量。

int num2;

int main()
{
  // do something
} 

memcpy()仅将值从一个位置复制到另一个位置,您需要已经初始化的内存,可以是堆或堆栈。

答案 1 :(得分:2)

变量num1num2都是自动变量,这意味着它们会自动分配到堆栈中。变量具有功能范围。一旦它们被定义的函数返回,它们就会从堆栈中释放出来,即它们不再存在并且试图访问它们是未定义的行为。

在函数内定义的变量(包括函数参数)并且不是static的变量是自动变量。它在调用函数时自动在堆栈上创建,并在函数返回时被销毁。因此,它是函数的局部,即它具有函数范围。

在任何函数之外定义的变量称为全局变量。静态变量和全局变量都有static storage duration,这意味着它们既不在堆栈上也不在堆上,而是在文本段(如果它们是const)或程序内存布局的数据段中分配甚至在大多数现代机器上进入自己的内存段。需要注意的重要一点是,当程序开始执行时,内存会被分配一次,并且永远不会被释放,因为全局变量和静态变量的生命周期会延伸到程序的整个运行过程中。此外,如果未显式初始化,则全局变量和静态变量默认初始化为零。阅读本文 - The initialization of static variable in C

您无法在堆上创建变量,即,无法将标识符绑定到堆上的内存位置。您可以在堆上分配内存并在变量中存储指向它的指针,但变量本身不在堆上。如果变量是本地变量和非静态变量,则它位于堆栈中,否则它位于文本段或数据段中。阅读本文了解更多详情 - Memory Allocation in C Programs

答案 2 :(得分:1)

Q 堆上的新变量是什么?

A 编号详情可在What and where are the stack and heap?

查看

答案 3 :(得分:1)

您对pointermemory感到困惑。当您使用malloc时,您将获得所请求大小的堆内存,即地址范围为startAddrendAddr的字节集合。现在你已经分配了堆内存,但是你将如何访问它,因为它是连续的你只需要知道起始地址(startAddr)和内存块的大小(你自己已经分配它就已经知道了)。 / p>

成功分配内存后,startAddr会返回此malloc。你可以保存在一个指针中,或者你可以将地址(不是整个分配的内存)复制到其他指针。

现在堆栈和堆内存之间存在差异:

每当你声明任何变量(指针也是一个存储地址的变量)不是globalregisterstatic时,它总是进入堆栈。堆只能用于动态分配,并且只能由alloc系列函数访问。

总结:

num1num2两个指针都在堆栈上,因此只能在当前功能块中访问。

虽然地址num1(和num2)指向的是堆内存,该内存可供整个程序使用,即具有此地址的任何其他函数(或多线程程序中的线程)都可以访问分配堆内存。