C语言中返回局部变量或临时变量的地址的错误

原创 2015年07月06日 16:13:41

先看如下代码, 在编译运行的时候会抛出警告——-warning C4172: 返回局部变量或临时变量的地址,并且在main函数中的打印结果不符合我们的预期

代码如下:

int* visitArea(){
    int a = 10;
    return &a;
}


int main(){
    int* a = visitArea();
    printf("%d\n", *a);
    printf("%d\n", *a);
    printf("%d\n", *a);
    return 0;
}

打印结果:

10
-2
-2
请按任意键继续. . .

我们通过上面可以发现main函数调用visitArea ,返回visitArea中的局部变量的地址,然后赋值给main函数中的变量进行打印, 第一个printf语句打印出了符合我们预期的结果,但是接下来的两个语句打印的结果不符合我们的预期, 这是为什么呢?

在C语言中,局部变量是分配在栈空间上的, 当函数调用结束后,他由编译器释放. 我们通过调用visitArea得到了他的局部变量的内存地址, 然而在第二次打印的时候他这个内存地址被”破坏”了, 所以出现了这个意想不到的结果.

所以我们在书写C语言程序时候, 如果返回指针(变量地址),应该返回堆区或者全局区的,这样就可以避免这个”意想不到的”结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C/C++ waring:返回局部变量或临时变量的地址

牛客题目: string& test_str() { string str = "test"; return str; } int main() { string& str_ref...

C语言中函数的思考(可以返回局部变量吗)

一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地...
  • kai8wei
  • kai8wei
  • 2015年03月28日 10:57
  • 2302

关于 C++ 函数返回局部变量的警告

关于 C++ 函数返回局部变量的警告 当函数返回时,局部变量和临时对象被销毁,所以返回的地址是无效的。需要修改代码,使其不返回局部对象的地址。 那么如何解决?该怎么修改代码?...
  • maxsky
  • maxsky
  • 2014年11月27日 16:21
  • 4128

解决c/c++函数返回局部变量char*的错误

http://blog.csdn.net/maxsky/article/details/41547399 先来一段代码: [cpp] view plaincopyprint? ...
  • earbao
  • earbao
  • 2015年06月04日 11:29
  • 2348

C语言的那些秘密之---函数返回局部变量

一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地...
  • haiwil
  • haiwil
  • 2011年08月17日 13:06
  • 28014

全局变量、局部变量在内存中的位置

一般工程编译完成后会生成.o 文件 然后通过link 成一个完整的镜像  ELF 文件一般包含 一下几个代码段 :  file header字段里存放了描述整个文件的基本属性信息的内容,如...
  • shuzjd
  • shuzjd
  • 2012年09月17日 14:54
  • 2622

局部变量地址的返回

char *fun() { char str[] = "hello"; return str; } 这个函数的返回值?以及这个函数在栈上的存储布局 #include #include #inc...

【c语言】关于临时变量出其作用域就释放的例子

// 关于临时变量出其作用域就释放的例子 #include // 临时变量s出函数作用域就销毁了,该空间里就是随机值 unsigned short *sum(unsigned char a, u...

c语言中返回指向临时变量的指针的探讨

今天在CSDN的一个Blog上看到了一篇讲C/C++中常见内存错误的文章,里面讲到了 返回指向临时变量的指针会导致不可预料的后果,原文如下:10.返回指向临时变量的指针大家都知道,栈里面的变量都是临时...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中返回局部变量或临时变量的地址的错误
举报原因:
原因补充:

(最多只允许输入30个字)