返回指针的函数的问题

作者&投稿:邹念 (若有异议请与网页底部的电邮联系)
C语言指针作函数参数时的返回问题~

首先,弄懂函数参数都是靠值传递。指针也是。
进入函数后,函数创建几个空间给形参,再把实参数值拷过来。退出函数时,把形参空间释放,则影响不到实参。这就是值传递。
swap(int *p1,int *p2)函数首先创建两个空间,是指针,再把实参复制过来,即p1=pointer_1=&a,p2=pointer_2=&b,改变p1,p2就分别指向了a,b.改变p1指向的值就是改变了a。然后交换*p1,*p2,ab就互换了。函数退出,释放p1,p2所占的内存空间。但是a,b值互换了。swap函数没有改变实参pointer_1,pointer_2的内容,只是借助指针实现了巧妙的乾坤大挪移。

学到c++后有个引用例外,那是后话了。

++++++++++++++++++++++华丽丽的分割线+++++++++++++++++++++

其实很简单,不要硬记规律,要理解了。
第二个例子中swap(int x,int y)没有改变原来实参a,b的值
第一个例子中swap(int *p1,int *p2)也没有改变原来两个实参pointer_1,pointer_2的值,他们值分别是是a,b地址,但pointer_1,2指向的内容改变了,改的是以pointer_1,pointer_2的值为地址的内存单元的值。

这种方式叫做“用指针函数*creat()的返回值来传递动态内存”,这是一个C语法

首先你要注意,子函数*creat()用了malloc动态申请内存,而return返回的是指针变量所指向的地址,而不是指针!相当于将你所申请的动态内存返回给主函数

int *fun(void)//这里是指针函数
{
int *p = (int *) malloc (int);//动态申请内存//p在这里指向了一块合法内存的地址
return p;
}

void main(void)
{
int *q = NULL;
q = fun();//fun()返回指针p所指向的地址,(指针p是在栈上创建的,所以*fun()函数运行完,指针所分配的内存被系统自动释放)这时q指向p,得到了malloc所申请到的内存
free(q);//释放动态内存
}

假设函数的返回值是一个指向整形变量的指针,而且它指向的变量是在函数内部声明的,函数调用结束了,该变量的内存也应被撤销了,那么返回这个指针还有什么意义吗?

没有意义。该指针将指向一块含非意料内内容的内存空间,使用该指针将导致非法内存引用。

-----

还是这种情况对变量的生存期来说是个例外?

不是例外。如果在函数返回值是函数的内部变量,那么实际操作的时候,编译器会将该变量的一个副本返回给调用者,使用时没有问题。而如果是指针被返回的话,如前所述,使用时将会导致非法内存引用。

-------

引用野指针会出现错误吗?

显然会。

--------

new出来的或者malloc出来的为什么都需要人工撤销?

动态分配的内存空间在堆中。
而且C和C++中所谓的动态内存分配机制是这么规定的,C/C++本身将不对new和malloc出来的空间负责回收,因此为了防止内存泄露,回收工作必须由程序员自行完成。

内部变量被撤消后你的指针就是野指针了,当然也有办法的,就是在函数内部new出来一个指针,然后传出来,这个有点违背谁申请谁释放的原则,但是有时候也必须这么做.

回答补充:

野指针使用当然会出问题,如果运气好的话,可能看不出来,因为指向的空间没有被其他变量使用.
new或者malloc出来的空间在windows堆中,不是在栈中,所以函数退出的时候,空间并没有弹出,另外与语言本身也有关系,c或者c++没有自动垃圾回收机制

关于函数指针数组的定义
关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。

第一种,标准方法:

{分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。
根据分析:首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。}

第二种,蒙骗法:

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。函数名相当于一个指向其函数入口指针常量。
那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。
那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。

首先看函数指针的声明:

假设有一个函数如下

int Max(int x,int y)

{return (x>y)?x:y;}

那么此函数的指针的声明就是这样

int (*pMax)();

可以如此赋值,获取Max函数的地址

pMax=Max;

问题来了,如果我们要声明一个指向Max函数的函数指针类型的数组呢?不好写了。

此时typedef的作用就显现出来了

typedef int (*pMax)();

如此一写,把pMax定义成一个类型

如此这般 pMax pMax_array[2];

就可以定义一个2个元素的函数指针数组了。

可能大家对这种声明的简化方式很陌生。

看看我们惯常的用法

typedef unsigned int UINT;

UINT i;

这样就定义了一个 unsigned int 的变量i;

实际上

UINT i;

等同于

unsigned int i;

即将typedef中的UINT替换为i。

这里

typedef int (*pMax)();

pMax pMax_array[2];

实际上便是

typedef int (*pMax_array[0])();

typedef int (*pMax_array[1])();

看到了吧,一切就是这么明了。

有人可能会问,为什么不直接写成

int Max(int x,int y)

{return (x>y)?x:y;}

int (*pMax)();

pMax pMax_array[2];

其实这个问题很简单,你见过如此写法的吗?

int i;

i i_array[2];

显然没有,那么上面的那种想法也是不正确的了。(Over)

int *GetMem(int i)
{
int *p = new int[i];
for (int j=0; j<i; j++)
p[j] = 0;
printf("%d %d\n",(int)&p, (int)p);
return p;
}
void FreeMem(int *p)
{
if (NULL != p){delete[] p; p = NULL;}
}
int main()
{
int *str = GetMem(10);
printf("%d %d\n",(int)&str, (int)str);
FreeMem(str);
return 0;
}
//这种情况不是例外。
//正如风骚的可乐所说,函数调用结束后生成一个副本给arr,也就是p并不是arr,但p的指却能传给arr,这个值是一个地址,这个地址指向一块堆空间。
//说的比较绕,希望对你有帮助。

char *fun()
{
char *p=malloc(sizeof(char));
*p='a';
return p;
}

void free(char *p)
{
free(p);
}

在堆中就不存在以上问题了。但要注意写出相的释放函数


返回指针的函数的问题
没有意义。该指针将指向一块含非意料内内容的内存空间,使用该指针将导致非法内存引用。--- 还是这种情况对变量的生存期来说是个例外?不是例外。如果在函数返回值是函数的内部变量,那么实际操作的时候,编译器会将该变量的一个副本返回给调用者,使用时没有问题。而如果是指针被返回的话,如前所述,...

c++返回指针问题
在某函数内伸请的指针一般是局部变量,如果返回局部变量(在函数结束时会被收回内存空间)就会报空指针错误,就像auto声明的变量一样,而static定义的变量是在全局数据区,函数结束的时候空间不会被收回,当程序结束时才会收回。auto变量在离开作用域是会变程序自动释放的。

C语言中函数返回指向栈内存的指针的问题
p是指向局部变量的指针,当函数退出时,局部变量会被释放,这时,p所指向的位置就不一样是原来的数。因为fun()函数返回的值被计算机的临时变量存放,当赋值给p的时候,p是指向临时变量的地址,所以还可以读取出100。p = "hello"这是常量字符串,从静态存储区分配,第一步字符串"hello"从静态存储区...

当函数体返回值是指针时,必须返回空指针吗?
不一定。如果必须要返回空指针,那么函数体返回指针就没有意义了。实际上可以返回任意指针值,不过要注意,不要返回局部变量的地址,这样在函数退出后局部变量释放,使得返回的成为野指针。一般可以返回:1 动态申请的内存 2 静态变量或全局变量的地址 3 参数传入的地址。

当一个函数的返回值为指针类型时如何调用
返回值类型为指针的函数格式:type * function(){…},其中type为某种类型(如char、int等,或类、结构体等等),function为一个函数名。调用方式:type * var; \/\/定义一个与返回值类型相同的指针变量 var = function(); \/\/执行函数,并将返回值赋值给变量var cout<<*var; \/\/输出指针所指向的...

c语言中自定义一个返回指针的函数,为什么在主函数中调用时,不能引用这...
返回的是个指针,也就是个地址,如果你要引用的是这个地址,没有问题的。如果你想通过这个地址去引用它所指向的变量,那就不一定了,因为那个变量不一定还存在。就好比你某次去某个地方玩,发现一家小饭店很好,你记下它的门牌号带回来了。在你回家后,你还可以看这个你自己记下的门牌号,看一千遍...

C++中函数返回指针 与内存的问题
函数返回的指针是一个副本值,但是那块内存的地址是不会变的。动态申请的内存在堆中,只有用户手动释放这块内存,这块内存的内容才被系统回收,如果用户不释放,就会产生内存泄漏。内存泄漏是:程序运行期间,用户动态申请的内存没有释放。当程序结束后,系统给应用程序分配的所以资源都会自动回收。

函数的返回值为指针?为什么不能写return *b呢?如图
比如b是个指针,如果你想返回指针,或者说返回一个地址就写return b;那么主程序中可以用这个地址当作指针去找到它指向的数据;如果你想返回指针b指向的整形数据是多少则写return *b;加星号返回的是指针指向变量的内容。

C++ 函数返回指针的释放问题,如何释放?
func这样写的话,就是要求调用func的函数来释放p 因为func在main中被调用,而又main来释放,没有问题 因为free语句是main的最后一句,就算不写,程序结束的时候也会自动回收 不过其他场合,只要程序不终结,就必须手动free掉,不然内存就泄漏了 main里面的s是什么东西,应该用不着吧 ...

...函数与指针不是很清楚喔。 什么返回指针的函数。 返回函数的指针...
1. 指向函数的指针,就是说这个指针指向的是一个函数的地址。void somefunction() {...} void * fPoint = somefunction;2. 返回指针的函数,是说这个函数返回的是一个指针。int * returnIntegerPoint() {...} 3. 指向指针的指针,就是说一个指针,又指向了另一个指针,后一个指针又指向了...

东山县15941301792: C语言 返回指针的函数 问题 -
常店追风: 返回指针 要看这个局部指针变量在函数运行后 保存了哪个空间的地址了 指针里的值是可以返回的 就像你说的 “ return i,主调函数知道一个i就可以了 ” 同样主函数 知道一个指针里的地址就可以了. 但是这个地址入口的空间现在可用否,那要看具体情况了 1 此地址所指向的空间 是个局部变量 也就是存在栈区,那么在申请次局部变量的函数结束时,局部变量被释放,用户没有使用他的权限了 出错 2 此地址所指向的空间 不是局部变量,比如是个静态变量 全局变量 或者是malloc申请的存在堆中的,那么他就不是你随着函数的离去二离去了,他任然存在,结果可用 正确

东山县15941301792: 返回指针的函数问题 -
常店追风: 指针本事的存储内容就是一个地址 用指针肯定返回的就是一个地址 这个地址中存储的内容是返回函数的起始地址

东山县15941301792: 函数返回类型为指针时要注意什么问题 -
常店追风: 指针函数

东山县15941301792: 一个c++返回指针的问题 -
常店追风: 呵呵,首先啊,要理解这个指针P的含义,这个指针P是个指针变量,它里面存放的是某个变量的地址,比如:int a = 2; int *p = &a;这里&的作用就是取a的地址,然后存到p里面.当我们要访问这个a(也就是2啦)的时候,可以直接访问*p,这...

东山县15941301792: 函数返回值为指针的问题 -
常店追风: #include "stdio.h"#include "string.h" //这里记得要引用这个库,这是strcpy的头文件 char* GetFileName() { char filename[20] = "file_0001.dat"; //这块不能用filename[], //没有这种类型,那种形式只能做为函数参数来使用,不能用在变量...

东山县15941301792: C语言指针返回问题 -
常店追风: 1.返回函数里面局部变量的地址,而函数结束后,该地址就释放掉了,所以在函数外访问、修改该地址都是非法的,结果不可知2.指针为野指针,然后向野指针赋值(*ptr=10),非法访问,结果不可知,容易崩溃,切函数返回的也是野指针3.函数内申请动态内存空间,函数结束,该内存空间不会释放,函数返回该内存空间地址,外部可以使用,但外部需要手动释放该空间(free(动态内存空间地址))

东山县15941301792: 返回指针值的函数 -
常店追风: 我看了一下,楼主的程序有些不必要的语句: 我修改了一下,但总体没有改,一些出错的地方我已表明,出错的主要原因是类型赋值的错误!!!#include <stdio.h> void main() { void fun(float score[],float sum,float num[],int &i);float score[4],...

东山县15941301792: c语言 函数返回数组指针? -
常店追风: 由于你在子函数int *shuzu(void)中定义的数组 a[4];属于局部变量,在子函数结束时会被释放,所以返回的指针变成野指针,会乱码;简单的解决方法有两种,1. 将数组定义在主函数之前(#include 下面),那么就变成了全局变量,不会被释放了;2.使用malloc或者calloc开空间后再赋给这个数组,这样也不会被释放了;第一种方法有缺点,以后学到全局变量的时候会知道,第二种方法估计你还没学到,不过很简单,百度一下就会了~~~

东山县15941301792: C语言函数的返回值为指针时的问题 -
常店追风: week_day作为lookstr()的参数,经过函数lookstr()提取之后,return(table[day]),得到一个静态字符串的指针;输入数字有误情况下return(NULL).

东山县15941301792: C语言怎么让“函数”返回“指针数组” -
常店追风: 首先,你不应该返回局部变量的指针,因为局部变量在离开函数后就会被销毁.如果你想这样返回一个数组的话,你应该malloc出一个数组来返回. 至于应该return什么,return (malloc出来的那个指针)就可以了. 例如 int** foo() { int **p = (int **)malloc(sizeof(int *)*10); ... ... ... return p; } 这个p指向一个内存段,这个内存段存有十个int*类型的元素.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网