Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分配malloc';将d变量值转换为新变量,新变量是否也在堆内存中?_C_Memory_Heap - Fatal编程技术网

分配malloc';将d变量值转换为新变量,新变量是否也在堆内存中?

分配malloc';将d变量值转换为新变量,新变量是否也在堆内存中?,c,memory,heap,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?*/

我不清楚下面的新变量“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;
}

Q堆上的新变量是什么


A否。无论何时使用
malloc,都可以在查看详细信息堆中分配内存(如果内存可用)

在您的例子中,
num1
是在
malloc
时指向堆中内存的指针。(
num1
指针仅存在于堆中。)

当您使用上述语句时,您所说的是取
num1
所指向的值,并赋值it
num2

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

要在没有malloc的情况下分配内存,可以尝试
global
static
。它将在编译时在
数据段中为其分配内存。但根据我的知识,你不能直接分配

例如,取全局变量

int num2;

int main()
{
  // do something
} 

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

您将与
指针
内存
混淆。当您使用
malloc
时,您会得到请求大小的堆内存,即地址范围为
startAddr
endAddr
的字节集合。现在您已经分配了堆内存,但您将如何访问它,因为它是连续的,您只需要知道起始地址(
startAddr
)和内存块的大小(您自己分配它时已经知道)

成功分配内存后,
malloc
返回此
startADR
。您可以将其保存在单个指针中,也可以将该地址(而不是整个分配的内存)复制到其他指针

现在,堆栈内存和堆内存之间的区别是:

当您声明任何不是
全局
寄存器
静态
的变量(指针也是存储地址的变量)时,它总是进入堆栈。堆仅可用于动态分配,并且只能通过
alloc
函数族访问

总结如下:

num1
num2
这两个指针都在堆栈上,因此只能在当前功能块内访问


当地址
num1
(和
num2
)指向整个程序可用的堆内存时,即任何其他函数(或多线程程序中的线程)拥有此地址可以访问分配的堆内存。

两个变量
num1
num2
都是自动变量,这意味着它们会自动分配到堆栈上。变量具有函数作用域。一旦在返回中定义了它们的函数,它们就会从堆栈中释放,也就是说,它们不再存在,试图访问它们是未定义的行为

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;
}
在函数内部定义的变量(包括函数参数)不是
静态的
,它是一个自动变量。当函数被调用时,它会自动在堆栈上创建,当函数返回时,它会被销毁。因此,它是函数的局部,即它具有函数范围

在任何函数之外定义的变量称为全局变量。静态变量和全局变量具有
静态存储持续时间
,这意味着它们既不在堆栈上也不在堆上分配,而是在程序内存布局的文本段(如果它们是
常量
)或数据段中分配,甚至在大多数现代机器上分配到自己的内存段中。需要注意的重要一点是,当程序开始执行时,内存分配一次,并且永远不会被释放,因为全局变量和静态变量的生存期会扩展到整个程序的运行。此外,如果没有显式初始化,全局变量和静态变量默认初始化为零。读这个-


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

不,它在堆栈上…变量的存储不会因为复制了值而改变。有没有一种方法可以在不执行malloc或calloc的情况下将num2放在堆内存上?是否可以使用一些复制功能(如memcpy)?thanksAn自动(自动)变量始终进入堆栈。您可以将其声明为静态以使其转到数据段。但对于堆,您需要malloc或指向以前的malloced内存块。在这种情况下,如何指向以前的malloc内存块?thanks@TonyGW:如果没有显式的
malloc
calloc
,则无法访问堆内存。虽然如果您使用的是内存较小的嵌入式系统,您可以直接访问堆内存地址并尝试对其进行操作,但这是一种肮脏且不友好的方式。不要只发布链接,解释OP的答案。如果你认为两个问题相似,那么将OP的问题标记为重复,而不是在此处发布其他答案。