返回局部变量和指针

来源:互联网 发布:linux增加空间 编辑:程序博客网 时间:2024/05/17 01:08

返回局部变量时,函数将值复制保存给调用者,函数执行完毕后内存空间被释放;

返回指针时,函数返回的地址,但是此时地址空间已经被释放,已经得不到值,所以会有错误;

#include <stdio.h>
#include <string.h>

char* get_str(void)
{
        char* str = "abcd";
        return str;
}

int main(int argc, char* argv[])
{
        char* p = get_str();
        printf("%s\n", p);

        return 0;
}


上述代码中,str是局部变量,函数返回后应该释放掉了,但为什么get_str返回后,还能正常输出呢?
 
char *str="abcd"; 这种方式内存分配在静态存储区,str指向"abcd"这一字符串常量,get_str()函数返回指向这一字符串常量的地址的指针,所以会有main中的打印结果
 
 
字符串常量的地址是存放在局部变量str中的,get_str()返回后这个局部变量str被释放了,怎么会有正确结果呢?
 
打个比方:
阿四知道CU网站的地址。
阿三打电话给(call)阿四,“阿四,告诉我CU网站的地址”
阿四告诉阿三CU网站的地址后就跑掉了,阿四不见了,但CU网站还在。
阿三知道了CU网站的地址,也就找到了CU网站。
 
返回局部指针不正确,但如果局部指针指向静态区常量还是不会出错的
 
————————————————————————————————————————————————
 一般的来说,函数是可以返回局部变量的,函数一般的操作是吧局部变量复制后返回给调用者,不能返回局部变量的是指针,因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。但是其他的值都是没问题的,其实都是一样的东西,只是指针在这种情况下被混淆了。
局部变量的作用域只在子函数内,在返回后,局部变量的内存已经释放。所以,如果是值的话,不涉及地址,程序不会出错。但是,如果是地址的话,程序会在运行后出错!有时候这个错误不会在运行时马上出现,但是这个错误始终是潜在的风险!

0 0