【发布时间】:2020-12-09 19:36:48
【问题描述】:
我在玩 C 内存和指针,我有一些问题:
int* foo(){
int a[100] = ...;
int* b = malloc(100 * sizeof(int));
... do something ...
return b
}
- 退出函数后
a消耗的内存是否立即释放? - 将定义更改为
int b [100];是否等效?
【问题讨论】:
我在玩 C 内存和指针,我有一些问题:
int* foo(){
int a[100] = ...;
int* b = malloc(100 * sizeof(int));
... do something ...
return b
}
a消耗的内存是否立即释放?int b [100]; 是否等效?【问题讨论】:
此声明
int a[100] = ...;
声明一个具有自动存储持续时间的本地对象。所以退出函数后,数组将不再活跃,它的内存可以用于其他目的。
从函数返回数组
int b [100];
喜欢
return b;
使返回的指针无效,因为正如上面所说的那样,数组 b 在退出函数后将不再存在
至于动态分配的内存
int* b = malloc(100 * sizeof(int));
只有当你隐式调用函数free或进程停止执行时才会释放它。
如果数组具有静态存储持续时间,您可以返回该数组。例如
static int b[100];
【讨论】:
int* b = malloc 更改为int b[],对吗?
请记住,a 的作用域是函数,一旦函数退出它就超出了作用域,这意味着对它的任何引用(如指针)都将失效。了解作用域非常重要,因此在最终无意中将未定义的行为引入程序之前,请务必了解更多相关信息。
将b 更改为与a 相同会使它遇到相同的问题。 malloc() 用于动态分配某些东西,它在free() 之前将一直有效直到显式释放。
不要忘记分配内存伴随着释放它的责任。您需要制定一个计划来处理该分配。
【讨论】: