C语言函数返回值实现机制

我们知道,在子函数中返回局部变量的值是不会出什么问题的,但是,返回一个局部变量的指针或者引用时,在后续解引用这个指针时就得不到理想的结果,原因在于:子函数中的自动变量(栈内存中的变量)会在子函数返回后被释放掉,但是返回值会被保存在cpu的寄存器中,因此,在返回子函数后,返回值能从寄存器中将返回值赋值给调用函数中的变量,如果返回值是一个指针,那么该指针所指的内存地址会被保存在寄存器中,但是,指针指向的内存却被释放掉了(即值未定义)。因此,在编写代码时一般不会返回指向局部变量的指针,除非一下三种情况:

1)子函数中定义了静态局部变量,函数可以返回指向该静态局部变量的指针。因为该变量分布在内存的静态区(在函数编译时就将被初始化),所以在子函数返回时该变量仍然存在。

char * func1(){

static char name[]="Jack";

return nema;

}

这里“Jack”存储在只读存储区,不能更改,将其赋值给name数组,即复制到静态存储区,因此name中保存的字符串不是常量字符串,可以通过数组下表进行更改。

2)子函数返回一个常量的指针,比如字符串常量,整形常量等。因为常量是定义在只读存储区,所以该常量也不会在子函数返回时被释放。

char * func2(){

char *name="Jack";

return nema;

}

3)子函数返回一个指向动态分配内存的指针。动态内存是在堆内存中分配的,需要程序员手动释放,否则造成内存泄漏,所以在手动释放该指针之前都可以返回该指针。

char * func3(){

char *name = (char *)malloc(20);

return nema;

}

你可能感兴趣的:(c)