堆栈帧内存分配

Mar*_*adi 3 c stack

就像每个函数都被放在一个堆栈框架上执行它,并在完成后刷新它.因此,任何局部变量都不可用于其他函数.但那么我们如何能够将一个局部变量返回给调用者呢?

int pickMin( int x, int y, int z ) {
 int min = x ;
 if ( y < min )
    min = y ;
 if ( z < min )
    min = z ;
 return min ;   }
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常.但是在下面的代码中,编译器确实给出了一条警告信息 - " warning: function returns address of local variable [-Wreturn-local-addr] return a;"但是它最后打印了一个垃圾值,我认为这很好,因为变量已经被刷新了.但为什么不在ABOVE计划中发生这种情况?!我的意思是,它也应该给我一个垃圾malloc值.而且,我知道下面代码中的问题可以使用,然后返回该值来解决.:)

int *returnarray(){
 int a[10]; int i;
  for(i=0;i<10;++i){
     a[i] = i;
 }return a;}   
Run Code Online (Sandbox Code Playgroud)

Eli*_*gem 5

C按值传递所有内容.在您的第一个代码段中,return min返回一个int变量.它的值被返回.第二个片段由return一个数组名称组成,它会衰减成一个指针.返回
局部变量的内存地址.但是,此变量存在的函数已返回,并且访问此函数使用的内存然后调用未定义的行为.

处理这种情况的方法(即:需要返回数组)是通过将目标数组作为参数传递给函数,或者通过使用malloc并返回该指针来分配内存.
堆内存有点慢,更容易出错,并且需要你照顾它.不过,这里有两个方法的例子,
create_fill分配,分配和返回一个指向堆内存的指针,fill_array不返回任何内容,但是要求你传递一个数组(衰减成指针),以及填充的最大长度.优点是:堆栈内存不需要那么多的关注,并且将超过堆.