我对以下新变量“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;
}
答案 0 :(得分:2)
无论何时使用malloc
内存都在堆中分配(如果内存可用)。
在你的情况下,num1
是malloc
时堆中内存的指针。 (num1
指针仅存在于堆中。)
int num2 = *num1;
当您使用上述声明时,您所说的是num1
指向的任何值,指定它num2
。
和int num2
表示您希望在堆栈中为当前堆栈帧创建内存。
要在没有malloc的情况下分配内存,您可以尝试global
或static
。它将在Data segment
的编译时为其分配内存。但堆不能按照我的知识直接分配
例如获取全局变量。
int num2;
int main()
{
// do something
}
memcpy()
仅将值从一个位置复制到另一个位置,您需要已经初始化的内存,可以是堆或堆栈。
答案 1 :(得分:2)
变量num1
和num2
都是自动变量,这意味着它们会自动分配到堆栈中。变量具有功能范围。一旦它们被定义的函数返回,它们就会从堆栈中释放出来,即它们不再存在并且试图访问它们是未定义的行为。
在函数内定义的变量(包括函数参数)并且不是static
的变量是自动变量。它在调用函数时自动在堆栈上创建,并在函数返回时被销毁。因此,它是函数的局部,即它具有函数范围。
在任何函数之外定义的变量称为全局变量。静态变量和全局变量都有static storage duration
,这意味着它们既不在堆栈上也不在堆上,而是在文本段(如果它们是const
)或程序内存布局的数据段中分配甚至在大多数现代机器上进入自己的内存段。需要注意的重要一点是,当程序开始执行时,内存会被分配一次,并且永远不会被释放,因为全局变量和静态变量的生命周期会延伸到程序的整个运行过程中。此外,如果未显式初始化,则全局变量和静态变量默认初始化为零。阅读本文 - The initialization of static variable in C。
您无法在堆上创建变量,即,无法将标识符绑定到堆上的内存位置。您可以在堆上分配内存并在变量中存储指向它的指针,但变量本身不在堆上。如果变量是本地变量和非静态变量,则它位于堆栈中,否则它位于文本段或数据段中。阅读本文了解更多详情 - Memory Allocation in C Programs
答案 2 :(得分:1)
Q 堆上的新变量是什么?
查看答案 3 :(得分:1)
您对pointer
和memory
感到困惑。当您使用malloc
时,您将获得所请求大小的堆内存,即地址范围为startAddr
和endAddr
的字节集合。现在你已经分配了堆内存,但是你将如何访问它,因为它是连续的你只需要知道起始地址(startAddr
)和内存块的大小(你自己已经分配它就已经知道了)。 / p>
成功分配内存后,startAddr
会返回此malloc
。你可以保存在一个指针中,或者你可以将地址(不是整个分配的内存)复制到其他指针。
现在堆栈和堆内存之间存在差异:
每当你声明任何变量(指针也是一个存储地址的变量)不是global
或register
或static
时,它总是进入堆栈。堆只能用于动态分配,并且只能由alloc
系列函数访问。
总结:
num1
和num2
两个指针都在堆栈上,因此只能在当前功能块中访问。
虽然地址num1
(和num2
)指向的是堆内存,该内存可供整个程序使用,即具有此地址的任何其他函数(或多线程程序中的线程)都可以访问分配堆内存。