Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
在C中从堆栈中释放内存_C_Arrays_Memory Management_Stack - Fatal编程技术网

在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这里的区别很好。已更新以反映。请参阅