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

C专家编程 第10章 再论指针 10.6 使用指针函数返回一个数组 阅读详情

有两种情况,函数会返回指向局部变量的指针:

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

这种函数通常可以被改造如下:

  • 把返回的指针加到参数列表里
  • 加一个指示长度的参数,或者假设指针指向的数据以null结尾
  • 修改返回指针指向的数据
  • 函数或者不返回值,或者返回一个bool值表示成功/失败

调用者负责内存分配,通常情况下只是声明一个普通的变量。例如:

char chArray[10];
bool bTest = MyFunction(chArray, 10);

参考地址:http://www.openismus.com/documents/cplusplus/cpointers.shtml

HIT《C语言程序设计精髓》:指针函数中的作用域 指针通常用于函数中多个值的返回,而指针函数内,其不被函数作用域所限制的只有通过指针来修改其指向的内存,而通过改向其指针方向是受到作用域的限制的。也就是说例如在函数中修改指针指向只在函数内有效,而在主函数中并没有被修改指向,但是在函数中修改指针指向的内存的值则是可以的。 #include <stdio.h> void fun(int *p); int main() { int i[]... 阅读详情

相关推荐

返回指向局部变量指针或引用的带来的问题讨论

返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量指针才有问题, 函数退栈之后,局部变量消失, 指针指向未知区域,所以出现问题。 返回局部变量的引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返回的。

August_1989 8950

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

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

good good study, day day up! 845

C语言指针作为函数返回

C语言允许函数返回值是一个指针(地址),我们将这样的函数称为指针函数。 我们定义一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> #include <string.h> char *strlong(char *str1, char *str2){ if(strlen(str1) >= strlen(str...

weixin_45743799的博客 3425

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

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

qq_45512728的博客 471

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

声明自动指针变量时,编译器为其在堆栈区分配内存,如果在函数中将另外一个自动变量的地址赋值给自动指针变量,在函数调用完毕后,指向堆栈区的栈顶指针将移动到调用此函数之前的地址位置,从而使自动变量失去意义,返回的失去意义的地址将会使程序不稳定。 函数返回指针。本来就是一个比较容易出问题的操作。在霍顿的《VC++ 入门经典》一书中,给出了一个很有代表性的例子,如下: // Ex5_

snakewarhead的专栏 5938

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

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

徐小小小hi的博客 1万+

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

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

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

函数返回指针的问题

函数体内部的局部变量指针作为返回返回。分三种情况 情况1:指针指向了常量区,参见之前我的一篇文章https://blog.csdn.net/wssjn1994/article/details/83182546 情况2:指针指向的空间经过了内存分配,那么外边的变量可以使用这个指针,因为变量定义在了堆上,出了函数也就是出栈之后不会受到影响。 情况3:只是定义了局部的指针或者数组,没有分配内存,...

wssjn1994的博客 386

C++ 返回引用

首先看一下返回值与返回引用之间的区别,函数返回值会创建一个临时变量作为函数返回值的副本,而返回引用则不会产生副本。 1)千万不要返回局部变量的引用,因为函数结束可能会释放局部变量的空间,因此对局部对象的引用将会指向不确定的内存,同时,指针也是一样,不能指向局部临时对象,否则指针可能变成野指针。 参考文章: https://blog.csdn.net/qq_33266987/ar...

godqiao的博客 693

【C语言】指针函数函数指针、数组函数

指针函数函数指针是开发中经常混淆的一个概念。还有传说中少见的数组函数

阿蛋的博客 427

【C语言】指针初阶

本文主要介绍了指针的基本概念以及使用,适合初学者入门。

weixin_74200123的博客 859

指针函数函数指针

指针函数函数指针

SSS_Sophia的博客 122

函数或方法返回一个内存地址

#include int *newInt(int value); int main() { int *x = newInt(20); std::cout << *x; delete x; x = NULL; return 0; } int *newInt(int value) { int *myInt = new int;

槑宝包 2482

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

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

weixin_30770495的博客 3441

返回指向局部变量指针或引用

返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗?  返回指向局部变量指针才有问题, 函数退栈之后,局部变量消失, 指针指向未知区域,所以出现问题。 返回局部变量的引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。  还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返

少想多做 3780

返回局部变量指针

一般我们都知道不能返回局部变量指针,但很多人知道其然,不知道所以然,那么接下来我们分析一下,先看两段代码 /*test1.c*/ #include <stdio.h> char* get_str() { char str[] = {"hello"}; return str; } int main() { char* p = get_str(); ...

TuxedoLinux的博客 1307
上一篇: 读《The C Programming Language》(7)
下一篇: 读《The C Programming Language》(8)
RiderOnStorm
博客等级 码龄24年 27粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值