函数不能返回局部指针变量

卫衣 / 双肩包 / T 恤/羽绒服等任选,下单送 CSDN 年卡 程序员周边任选一款实物,直接赠送 CSDN 会员年卡+ Coding Plan,写代码学习装备一起拿下 立即抢购

声明自动指针变量时,编译器为其在堆栈区分配内存,如果在函数中将另外一个自动变量的地址赋值给自动指针变量,在函数调用完毕后,指向堆栈区的栈顶指针将移动到调用此函数之前的地址位置,从而使自动变量失去意义,返回的失去意义的地址将会使程序不稳定。


函数返回指针。本来就是一个比较容易出问题的操作。在霍顿的《VC++ 入门经典》一书中,给出了一个很有代表性的例子,如下:

// Ex5_11.cpp

#include <iostream>

using std::cout;

using std::endl;

double* treble(double);                   // Function prototype

int main(void)

{

   double num = 5.0;                      // Test value

   double* ptr = 0;                       // Pointer to returned value

   ptr = treble(num);

   cout << endl

        << "Three times num = " << 3.0*num;

   cout << endl

        << "Result = " << *ptr;           // Display 3*num

   cout << endl;

   system("pause");

   return 0;

}

// Function to treble a value - mark 1

double* treble(double da
 
ta)

{

   double result = 0.0;

   result = 3.0*da
 
ta;

   return &result;

}



两个输出语句,一个直接输出3*5=15.另一个在一个函数中进行了乘法运算,也是5*3,存到result变量中也没有任何问题。返回这个变量的指针,输出时再接触引用。貌似也没有错误。两条输出语句似乎都应该输出15.但事实不是这样。编译器会抛出[Warning] address of local variable `result' returned 这样一个警告信息。程序运行后的结果也并非是我们预想的那样。第二条输出语句会输出一个不可预见的值。这是怎么回事呢?

仔细分析一下,result是作用域在treble函数中的局部变量。当函数执行结束后。变量result会被析构。其原先占用的内存区域已经被系统回收,可以存储任何数据。而返回的指向该地址的指针也失去了其原有的意义。因此我们得到这样一条准则:

永远不要从函数中返回局部自动变量的地址。

 

如果你真的需要这样操作。你可以在函数的参数表中传入一个指针变量。然后将需要写入的数据写入到该指针变量指向的地址。由于该指针指向的变量,作用域在函数体之外。因此不会在函数结束结束时被回收。

现在回到我们遇到的问题。时间函数localtime就是一个返回指针的函数。返回值类型:tm*

该如何接收这个返回值?当然是声明一个与之类型相同的变量。

于是你会这样写:tm* result;

接下来呢?还用问?赋值嘛。是不是这样:result=localtime(....);

返回什么类型,当然要给什么类型的变量赋值。但是这样却发生了我们不想看到的结果。

也许你想到了。就是这个指针!返回的指针在函数结束后不再有效。正确的方法可以是:

tm result;

result = *localtime(....);

也可以是:

tm* result;

*result = *localtime(...);

正确的方法的共同特点是在函数结束前,对返回的指针解除引用。然后用这个数值,为变量或指针指向的内存区域赋值。也就是说必须要复制函数的返回值。因为函数体中变量会被析构。

指针是灵活而强大的,避免低级错误,明确基本概念。才能让指针更好的为我们服务


进击的小白——知识点:函数返回指针的应该指向什么变量 接上一篇博客。 题目来自从LeetCode。 本文部分内容转载自https://www.cnblogs.com/mascotxi/p/4394893.html#commentform。 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素... 阅读详情

相关推荐

返回局部指针变量

返回值为数值时,返回局部变量可以,而返回值为引用或指针时,则存在风险。 局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间。函数返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是不涉及函数变量地址的。 如果要返回引用,也就是变量地址,那么它会把这个变量的地址放在eax中,(注意这个地址是位于函数

yinqiaohua的专栏 6943

有关指针函数不可以返回局部变量的地址的三种解决方法

#include<stdio.h> #include<string.h> #include<stdlib.h> //有关指针函数不可以返回局部变量的地址的三种解决方法#if 0 char *mystring(void) { //方法一:用static把局部数组改成静态数组 static char str[20]; strcpy(str,"Welcome li zhonghui

小灰灰的博客 3121

返回函数局部指针的问题

如果在一个函数中定义了一个局部的指针,是否能返回这个指针呢?我们虽搞清以下的问题。 第一:函数返回指针值应是返回指针变量里保存的地址,而不是指针变量本身。 第二:栈中的值是不能返回的,堆中的值则可以返回。 第三:在函数内定义的局部指针,都是在栈区声明的,但可以指向栈区、堆区和静态区。是否能返回指针指向决定。只要不是指向栈区的,都能返回。 第四:在函数内使用全局指针时,一定要先定义一个局

蓝伟的专栏 1529

不要返回局部变量指针或引用

不要返回局部变量指针或引用

good good study, day day up! 845

不能返回一个函数局部变量的引用或指针

返回方式是否安全注意事项按值返回✅最推荐方式,支持优化返回局部引用/指针❌会导致悬垂引用/未定义行为返回动态分配指针✅注意内存管理(建议用智能指针)通过参数返回函数不直接返回结果,易于控制返回 static 引用⚠️有状态、线程不安全,需小心使用。

qq_45512728的博客 471

不要返回指向局部变量指针

有两种情况,函数返回指向局部变量指针返回由malloc动态分配内存指针。这种情况是合法的,但它假设调用者会释放动态分配内存。在这种情况下通常会有另一个函数提供释放内存的功能。 返回指向局部变量指针局部变量占用的内存会在函数返回时被系统自动回收,因此系统可以随时将其它数据写入这块内存。在这种情况下函数可以编译通过,但不能保证运行正确。 这种函数通常可

风雨骑士 3056

C++不可以返回局部变量的引用或指针

返回引用事实上是返回变量的地址。 所谓的不可以返回局部变量的引用或指针,指的是不能返回局部变量的引用或地址给引用或指针。事实上还是看该地址的位置是否在该函数的栈区,若是在栈区,函数调用结束,该地址就被释放了。尽管会出现栈地址上的值没被销毁的问题,可能是该栈区还没被其他的函数堆栈掉。 1、int & fun() { int a = 10; return a; } 不可以

徐小小小hi的博客 1万+

局部变量局部指针变量返回

/* * @Date: 2019-3-12 * @Author: tracycw * @Description: 局部变量局部指针变量返回 为什么不能返回局部指针变量,却可以返回局部变量 函数局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收, ...

只要学不死,就往死里学 936

C语言中函数的思考(可以返回局部变量吗、可以返回局部变量的地址吗、可以返回局部指针吗)...

一般的来说,函数是可以返回局部变量的。局部变量的作用域只在函数内部,在函数返回后,局部变量内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向内存指针(注意...

weixin_30770495的博客 3441

c语言中关于局部变量返回

函数返回局部指针变量是否可行?      我们大家都知道指针函数返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象能够返回其地址,而什么样的对象不能返回其地址?静态变量与局部自动变量的主要区别是什 么?        要想明白这些就需要

谢文浩博客 806

C语言指针函数返回局部变量指针的问题

转载于:https://www.cnblogs.com/mascotxi/p/4394893.html 我们大家都知道指针函数返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象能够返回其地址,而什么样的对象不能返回其地址?静态变量与局部自动变量的主要区别是什 么? ...

CoderL 2262

C指针以及为什么不能返回局部指针变量,却可以返回局部变量

指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。 如:int* 是一个指针变量类型 指针变量和普通变量没有什么区别,指针32位四字节,里面保存的是一个内存空间的地址, 就像一个整形变量int a, a就可以代表一个整数,一个指针变量int* p,p就可以代表一个 地址数据,而*地址,代表去这个地址指向内存空间取出里面的内容,因此如果是要

既然选择了远方 便只顾风雨兼程 1万+

C指针一个小错误(2)-返回不能局部变量指针

下面是很简单的几个小事例 int *ret_int(void){ int p[] ={1,2,3,4};//或者int a=3; return p; //return &a;} 调用后将得不到数组值或者a值,成为野指针。(数组名就是数组地址,类似于指针,也不能局部变量返回值)int *ret_int(void){ int *p =(int *)malloc(s

hui辉的博客 390

Linux c 函数返回局部变量指针返回局部指针变量

Linux c 函数返回局部变量指针返回局部指针变量 最近再看c语言实用之道这本书,对于其中的一段代码不太清楚,关于c函数返回局部指针变量返回局部变量指针之间的区别,对于后者还是比较清楚的,前者一直有点懵,这次查阅一些资料,算是弄清楚了,在此作个记录。 c语言函数之间的调用是通过栈帧(Stack frame)实现的,栈帧其实都是进程虚拟地址空间中栈区域分配的一块内存空间,X86架构下,...

LEEBOYJCC的博客 794

关于C语言中返回局部指针变量

关于C语言中函数返回局部指针变量出错。

CD的博客 4356

函数返回局部指针变量的问题

我们大家都知道指针函数返回指针不能指向函数内的自动变量,如果需要返回函数的内部变量的话,就需要将该变量声明为静态变量。为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象能够返回其地址,而什么样的对象不能返回其地址?静态变量与局部自动变量的主要区别是什 么?      要想明白这些就需要理解程序的内存布局情况      程序的存储区域分为:代码段、只读数据段、已...

u011140203的专栏 787

关于C++函数返回指针的情况

本文理解借鉴为什么不可以返回局部变量指针 首先要明确,局部变量指针,与局部指针变量的区别 局部变量指针,若非static,则作用域仅为函数本身,在return之后即被释放,也即指针指向一个无效变量,因此不合理 而局部指针变量则不同,尽管指针变量本身的生命期在return之后也结束,但只要其指向对象有效,其地址也是有效的 开头链接中提到例子: //例1 int *f1() { int x...

MaloFleur 1万+
上一篇: startActivityForResult using the tab Activity 的解决办法
下一篇: Handler,Looper,Message
lynn_chen
博客等级 码龄16年 97粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值