请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下:

c语言函数中,结构体变量的地址可以返回,怎么普通变量的地址不能反回?这是为什么?

首先你要明确这样一个问题。
在C语言中,变量是有生命周期和作用域的(链接类型暂时不提)
生命周期,指变量对程序可见的范围

作用域,指变量对程序可修改的范围
注意:有生命周期的变量不一定有作用域(也就是说,可以访问的变量不一定全是可修改的)
另外你应该知道,C语言函数只能按值传参,而且形参被分配在栈上

对于指针,同样是按值传参的,只不过对指针进行间接引用(解除指针运算)时,被访问的都是同一个地址罢了,所以指针是个不特例的特例

有了这些基础知识,我们可以来解决你的问题了
首先,你第一个例子里的程序在fun函数中定义了一个指针y,并使指针y指向了形参x,也就是说,y指向了实参(可以类比得出这个结论)..所以函数可以成功返回,因为y指向的是实参,实参在函数中有完全的生名周期和作用域(可见性和可修改性),所以可以返回,他返回的地址在栈上,不过却是实参的地址,所以有效
第二个例子中,你的指针p指向了一个栈上变量,这个栈上变量在函数返回时(return时)就已经变得无效,所以你的返回是一个无效的地址(即改地址没有完全的生命周期和作用域),所以出错

编程提示:不要返回声明在栈上的变量,如果一定要使用,可以使用动态内存

好了,我的回答就是这样,希望可以帮助到你追问

你是不是搞错了啊,我怎么对不上号?

追答

没有搞错,你要是理解了我说的,C语言最难的地方你也就会了。
C最难的地方是什么,内存管理。
内存管理,管理什么。变量!!!
变量什么最重要?当然是属性,那么你要对变量进行研究,不了解他的属性是不可能研究明白的。
如果我说这些让你看了感觉很茫然,感觉我很2,那就没办法了,你不适合程序设计。
另外,如果你感觉楼下瞎说一大堆比我的说的好,那你就先别评最佳,让网友评评谁的好!
行了,我在总结一下我上述回答:
不能返回一个栈上变量!

追问

千言万语只想说谢谢!再谢谢!
1、我在fun函数中只定义指针px,没有定义y,指针指向了形参。
2、y指向了实参,你是怎么类比得出这个结论的,y是怎么指向实参的。
我不能再追问了,超过次数了!麻烦你加一下我的QQ,我用百度hi网页版发给你了!
谢谢啦!

追答

我Q:779139218

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-05
结构体本身就是一个特别的指针,也就是说例子1中的x和y都是ST类型的指针,他们只是存放了结构体的首地址,而普通变量就不是了,普通变量存放的就是变量本身的值。这么说的话,例子1中fun函数就是一个传址调用,而例子2却是传值调用。传值调用仅仅把数值传送给了x然后x=10又把x的值修改但是不影响a的数值,至于x变量的地址那就是个随机的内存地址,没有意义。
第2个回答  2013-06-05
地址可以返回,但是例二中函数中定义的x在函数结束时就释放消失了哦,于是返回的地址指向垃圾数据,没有疑问给分哦亲追问

那例一呢?什么情况,都是变量,结构体变量不能释放吗?

追答

例二中x是局部变量,生命期就在生他的函数中,你可以用全局变量就能实现,或者如果你会c++的引用。例1结构体生成的对象在return 0时释放

追问

哪有return0啊?

追答

就是主函数结束时自动会调用啊,你也可以显式调用,在主函数最后加个return 0;

追问

谁规定结构体变量需要在return 0时才能释放啊,这到底是什么意思啊,你能从栈和堆的角度说说吗?

追答

也可以不用再结束时释放(动态结构体),只是,当你把它做为实参传递时候(在传递的时候结构体肯定还存在吧!)编译器是把结构体的地址传送给形参(相当于引用),于是接收结构的函数对结构体操作就是对时参的操作。你可以参考下c++里的引用这中东西。

请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下:
首先你要明确这样一个问题。在C语言中,变量是有生命周期和作用域的(链接类型暂时不提)生命周期,指变量对程序可见的范围 作用域,指变量对程序可修改的范围 注意:有生命周期的变量不一定有作用域(也就是说,可以访问的变量不一定全是可修改的)另外你应该知道,C语言函数只能按值传参,而且形参被...

关于c语言的输入问题,请大家赐教了?
(3)这时不需要c = getchar ( );,用了也是添乱。(4)你原本的想法有道理,但是c语言早已经想到并做到了,它规定:输入数字时,所有空格(无论连续多少个),只起到分隔数字的作用,绝不会影响数字的读入。

有一道C语言的题目,请教大家:
1和0在c语言用来表示对与错。楼主的if(a=100)我感觉有问题,应该是if(a==100),=是赋值运算符,==才是逻辑运算符,a>100这个语句的判断结果在编译系统中用返回值0表示它是错误的,a<=100返回值用1表示。

c语言菜鸟请教一个问题!!
scanf("%f,&money");改为:scanf("%f",&money);还有:scanf("%d,&time");改为:scanf("%d",&time);

C语言数组问题
一个变量2个字节,9个变量18个字节,18化为16进制是12,然后看图

请教大家一个C语言的题目,当执行下列程序时输入:123456789,输出结果...
因为输入的时候用%c格式输入,char是一个字节,所以只取一个字符,也就是输入的1,后面的自然就给了i 再输入的123456789就全部给了数组s 跟编译器有关吧,我这里用的sizeof(int)==4所以23456789在-4294967296~4294967295范围之内,所以对于数组还要再输入一次 如果sizeof(int)==2则范围为-65536~65535...

C语言问题,高手请教~~谢谢了;阿
);C的错误原因:2*a不是一个确切的数值,所以不正确。但是如果是case 2*3,这样就是正确的,因为编译器在读到语句2*3的时候,相当于读到的是case 6,这符合case的用法。呵呵,大概就是这样了,不懂的话再留言,我会一直关注你这个问题的,有问必答的哦~祝你早日解决问题,成为一个编程高手!

一个c语言的问题。
scanf("%f",&c);这个程序在执行printf语句的时候,a还没有数值,因为scanf语句还没有执行,后面的参数其实是多余的了。因为此时a,b,c都是0。而且if(2<a<5)的写法是不正确的 应该要写成 if(a>2 && a<5) ,同时成立要用&& ,不过你前面已经判断了if(a<=2),后面就用else if(a<5)就...

急!要自考C语言,请教大家几个基本的编程题目
1. B !C就是0;&&语句j=!c已经为零,即真值已经为负,则后面i++不执行。故i=1,j=0;2.C 先看*说明s是指针,再看STRING说明s指向的是一个字符型数组。3.D.int a=4,*p=&a。 这个要怎么解释啊?*其实是告诉p是指针,应该理解为(int*)p,故a要加上取地址符。4.选项看不懂...

请教高手有关C语言死循环问题
答案有错误,第一个只要输入小于等于-3的奇数就不会死循环,第二个因为k>0总成立,所以是死循环

相似回答