我想知道是否有分配堆的数组,然后将其传递给函数。如果我在函数中填充堆分配的数组而没有堆分配值(即,仅将值分配给堆数组),则会产生错误,并且我将能够在函数之外访问堆数组的值,或者它们会之所以消失,是因为函数调用结束后堆栈变量消失了。
答案 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,这将是一场噩梦,并且会破坏首先分配数组的目的。