在C中从堆栈中释放内存
只是想知道是否有办法在运行时释放或减少从堆栈分配的内存。 例:在C中从堆栈中释放内存,c,arrays,memory-management,stack,C,Arrays,Memory Management,Stack,只是想知道是否有办法在运行时释放或减少从堆栈分配的内存。 例: 我可以在运行时释放6*4字节(假设int需要4字节)吗?本地变量使用的内存在定义它们的块结束时被回收。它们不能像动态分配内存那样被释放 如果需要调整正在使用的内存量,请使用malloc/free分配内存: int *num = malloc(NUM_BYTES); ... int *tmp = realloc(num, NEW_NUM_BYTES); if (tmp) num = tmp; ... free(num); 局部变量使
我可以在运行时释放6*4字节(假设int需要4字节)吗?本地变量使用的内存在定义它们的块结束时被回收。它们不能像动态分配内存那样被释放 如果需要调整正在使用的内存量,请使用
malloc
/free
分配内存:
int *num = malloc(NUM_BYTES);
...
int *tmp = realloc(num, NEW_NUM_BYTES);
if (tmp) num = tmp;
...
free(num);
局部变量使用的内存在定义它们的块结束时被回收。它们不能像动态分配内存那样被释放 如果需要调整正在使用的内存量,请使用
malloc
/free
分配内存:
int *num = malloc(NUM_BYTES);
...
int *tmp = realloc(num, NEW_NUM_BYTES);
if (tmp) num = tmp;
...
free(num);
我可以在运行时释放6*4字节(假设int需要4字节)吗
否。自动(或静态)存储持续时间的对象在其生存期内具有固定的大小,这取决于它们的声明。如果要使用较少的空间,请声明较小的对象
如果您专门声明一个小的ish数组,直到运行时才知道它需要的大小,并且您只想声明实际需要的大小,那么您可以选择使用可变长度数组。VLA支持在C2011中是可选的,VLA会带来一些固定长度阵列无法解决的潜在问题,但如果您可以接受,您可以这样做:
void count_to(unsigned char max) {
int numbers[max];
for (int i = 0; i < max; i++) {
numbers[i] = i + 1;
}
// ...
}
void count\u to(最大无符号字符数){
整数[max];
对于(int i=0;i
请注意,VLA可能没有初始值设定项,如果最终VLA大于您所考虑的值,您可能会遇到麻烦(例如,堆栈溢出)
您的主要选择是动态分配。动态分配阵列会带来代码和性能开销,这要求您确保释放分配的内存,但所有符合要求的实现都支持它,而且它通常支持比VLA大得多的对象
我可以在运行时释放6*4字节(假设int需要4字节)吗
否。自动(或静态)存储持续时间的对象在其生存期内具有固定的大小,这取决于它们的声明。如果要使用较少的空间,请声明较小的对象
如果您专门声明一个小的ish数组,直到运行时才知道它需要的大小,并且您只想声明实际需要的大小,那么您可以选择使用可变长度数组。VLA支持在C2011中是可选的,VLA会带来一些固定长度阵列无法解决的潜在问题,但如果您可以接受,您可以这样做:
void count_to(unsigned char max) {
int numbers[max];
for (int i = 0; i < max; i++) {
numbers[i] = i + 1;
}
// ...
}
void count\u to(最大无符号字符数){
整数[max];
对于(int i=0;i
请注意,VLA可能没有初始值设定项,如果最终VLA大于您所考虑的值,您可能会遇到麻烦(例如,堆栈溢出)
您的主要选择是动态分配。动态分配阵列会带来代码和性能开销,这要求您确保释放分配的内存,但所有符合要求的实现都支持它,而且它通常支持比VLA大得多的对象。是的,我理解这一点。我的问题是-我可以减少运行时从堆栈中获得的内存量吗。在这种情况下是24字节的内存。@SaurabhSuman不,你不能。如果要更改使用的内存量,应使用
malloc
/free
。@SaurabhSuman:您要求的是10个整数,其中4个为非零值,6个为零。编译器无法用更少的资源完成您要求它完成的工作。如果您编写了intnum[]={1,2,3,4,}代码>然后你就可以节省空间了。由于初始值设定项在编译时是固定的,所以选择由您决定-C让您思考。具有自动存储持续时间的对象的生存期在其块的执行结束时结束,而不是在它们超出范围时结束。生命是一段时间。作用域是代码中的位置。当一个函数调用另一个函数时,其标识符不在被调用函数的代码范围内,但其对象仍然存在。(另外,在函数调用期间,调用函数的执行将暂停,而不是结束。)@EricPostpischil这里的区别很好。更新以反映。是的,我理解。我的问题是-我可以减少运行时从堆栈中获得的内存量吗。在这种情况下是24字节的内存。@SaurabhSuman不,你不能。如果要更改使用的内存量,应使用malloc
/free
。@SaurabhSuman:您要求的是10个整数,其中4个为非零值,6个为零。编译器无法用更少的资源完成您要求它完成的工作。如果您编写了intnum[]={1,2,3,4,}代码>然后你就可以节省空间了。由于初始值设定项在编译时是固定的,所以选择由您决定-C让您思考。具有自动存储持续时间的对象的生存期在其块的执行结束时结束,而不是在它们超出范围时结束。生命是一段时间。作用域是代码中的位置。当一个函数调用另一个函数时,其标识符不在被调用函数的代码范围内,但其对象仍然存在。(另外,在函数调用期间,调用函数的执行将暂停,而不是结束。)@EricPostpischil这里的区别很好。已更新以反映。请参阅