能否将堆栈分配的值放入堆分配的数组中

时间:2019-02-11 19:08:31

标签: c heap

我想知道是否有分配堆的数组,然后将其传递给函数。如果我在函数中填充堆分配的数组而没有堆分配值(即,仅将值分配给堆数组),则会产生错误,并且我将能够在函数之外访问堆数组的值,或者它们会之所以消失,是因为函数调用结束后堆栈变量消失了。

3 个答案:

答案 0 :(得分:1)

如果您询问“是否可以将值从堆栈上分配的变量复制到堆上分配的变量”,答案是肯定的。

您可以将数据从堆复制到堆栈,反之亦然。

int i = 50;
int *p = malloc(sizeof(int));

*p = i;
printf("%d\n", *p);

假设malloc没有失败,则该程序的输出为50

答案 1 :(得分:1)

我想您要问的是,是否malloc一个数组并将其发送给函数:

  

我将其传递给函数。

会发生什么事,就是在函数的堆栈框架中创建了指向该内存(数组)的指针。数组未发送到函数中。只要您有足够的空间,就可以像对待其他阵列一样对待它。当函数退出时,其中的指针随框架弹出,但是所有数据都在调用函数(堆)的数组中。记住,每当将数组发送到fcn时,真正发送的是指向它的指针。

分配内存是堆的事实并没有改变任何东西。只要确保您有足够的空间,并且不要溢出内存即可。

编辑

  

如果我在没有堆的情况下在函数中填充了堆分配的数组   分配值

不知道您要问什么,如果您的数组说int *p1 = malloc(50*sizeof(int));,则可以在函数中放入50个整数。如果您仅发送int *p,则否。加* p仍然在堆栈中。您将需要malloc内存。

答案 2 :(得分:1)

在对数组使用malloc时,实际上是为要在数组中存储许多元素的空间分配空间。这就是为什么给malloc数据类型*容量的原因,堆中不需要存储任何其他内容。

如先前的答复中所述,将数组传递给函数时,存储在堆栈上的所有内容都是临时指针,该指针包含数组在堆上的位置。因此,如果您更改一个值,它将跟随指针并在那里进行更改。

在这种情况下,值的预先存储位置(堆栈中的变量或堆中的其他值)无关紧要,因为将其放置在数组中时,唯一要传输的是值。

您正在考虑的问题是,如果不是从堆栈上的变量复制值,而是用指向堆栈变量的指针填充数组,在这种情况下,值可能会被覆盖。只要函数退出时这些值在堆内存中,它们就安全无虞。

对于要添加到数组中的每个项目都必须使用malloc,这将是一场噩梦,并且会破坏首先分配数组的目的。