数组、指针和内存管理玩具C中的示例问题

数组、指针和内存管理玩具C中的示例问题,c,pointers,memory,C,Pointers,Memory,我在玩C内存和指针,我有一些问题: int*foo(){ int a[100]=。。。; int*b=malloc(100*sizeof(int)); …做点什么。。。 返回b } a消耗的内存是否在退出功能后立即释放 将定义更改为intb[100]是否等效 请记住,a的作用域是函数,一旦函数退出,它就不在作用域内,这意味着对它的任何引用(如指针)都将无效。理解作用域是非常重要的,所以在无意中将未定义的行为引入程序之前,一定要了解更多 将b更改为与a相同会导致相同的问题malloc()用于动

我在玩C内存和指针,我有一些问题:

int*foo(){
int a[100]=。。。;
int*b=malloc(100*sizeof(int));
…做点什么。。。
返回b
}
  • a
    消耗的内存是否在退出功能后立即释放
  • 将定义更改为
    intb[100]是否等效

请记住,
a
的作用域是函数,一旦函数退出,它就不在作用域内,这意味着对它的任何引用(如指针)都将无效。理解作用域是非常重要的,所以在无意中将未定义的行为引入程序之前,一定要了解更多

b
更改为与
a
相同会导致相同的问题
malloc()
用于动态分配某些内容,在使用
free()
显式发布之前,它是有效的

不要忘记,分配内存是伴随着释放内存的责任而来的。您需要有一个计划来处理该分配。

此声明

int a[100] = ...;
声明具有自动存储持续时间的本地对象。因此,退出函数后,阵列将不活动,其内存可用于其他目的

从函数返回数组

int b [100];

使返回的指针无效,因为如上所述,退出函数后数组b将不活动

至于动态分配的内存

int* b = malloc(100 * sizeof(int));
然后,只有当您隐式调用函数
free
或当进程停止执行时,它才会被释放

如果阵列具有静态存储持续时间,则可以返回该阵列。比如说

static int b[100];

好的,为了明确回答我的问题,我不能将
int*b=malloc
更改为
int b[]
,对吗?这应该会导致分段错误,我think@AlexColeman如果试图取消对返回数组的指针的引用,可能会出现分段错误。@AlexColeman如果数组具有静态存储持续时间,则可以返回该数组。
static int b[100];