只是想知道是否有一种方法可以在运行时释放或减少从堆栈分配的内存。 例如:
int num[10] = {1,2,3,4};
我可以在运行时释放6 * 4字节(假设int需要4个字节)吗?
答案 0 :(得分:1)
在局部变量的末尾定义时,将回收局部变量使用的内存。无法像动态分配的内存那样释放它们。
如果需要调整正在使用的内存量,请使用malloc
/ free
分配内存:
int *num = malloc(NUM_BYTES);
...
int *tmp = realloc(num, NEW_NUM_BYTES);
if (tmp) num = tmp;
...
free(num);
答案 1 :(得分:1)
我可以在运行时释放6 * 4字节(假设int需要4个字节)吗?
不。自动(或静态)存储持续时间的对象在其生命周期中具有固定的大小,具体取决于其声明。如果要使用更少的空间,请声明一个较小的对象。
如果您专门声明一个小数组,直到运行时才知道它的大小,并且只想声明实际需要的大小,那么您可以选择使用a可变长度数组。 VLA支持在C2011中是可选的,并且VLA会带来一些潜在的问题,而固定长度数组则不会,但是如果您可以接受,那么您可以这样做:
void count_to(unsigned char max) {
int numbers[max];
for (int i = 0; i < max; i++) {
numbers[i] = i + 1;
}
// ...
}
请注意,VLA可能没有初始化程序,并且如果最终获得的VLA大于您所考虑的范围,您可能会遇到麻烦(例如,使堆栈溢出)。
您的主要选择是动态分配。动态分配数组会带来代码,并且经常会有性能开销,并且要求您确保释放分配的内存,但是所有符合要求的实现都支持它,并且它通常比VLA支持更大的对象。