关于c语言返回字符指针的函数最近写了点返回值为字符型指针的函数,发现用函数内部的局部变量作为返回值,在
关于c语言返回字符指针的函数
最近写了点返回值为字符型指针的函数,发现用函数内部的局部变量作为返回值,在mian中显示乱码,或者就干脆没有,在网上看到有人说返回值不能使局部变量。加了static果真可以了。汗,以前都没注意到,请问这个这种问题的好的解释是?好像在模块化中用static不大好吧?
[解决办法]
函数是可以返回局部变量的,把局部变量复制后返回给调用者,但不能返回局部变量指向的指针,因为函数只是把指针本身复制后返回了,但是指针指向的内容在函数返回后已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。但是其他的值都是没问题的
[解决办法]
不明白LZ的具体问题。
局部变量是不能从外部访问的,因为局部变量只有在被调用时才会存在于内存中(具体地说是在运行时栈中),当函数被调用时,运行时栈在顶端为被调用函数分配一个临时栈帧,调用函数中声明的所有变量都在临时栈帧中分配相应的内存,当函数返回时,运行时栈弹出顶端栈帧(也就是被调用的那个函数的),因此所有局部变量作废,而后程序继续运行,运行时栈不断变化,而函数返回指针指向的内存单元就会不断变化,显示乱码很正常。
而当在函数中用static声明变量时,编译器用另一种机制对待此变量(静态变量),编译器在生成的目标文件中给静态变量分配符号表,并附有附属信息(控制访问),并且会分配相应的内存单元,也就是说固定的地址,存在于内存映像中的.data段,而不是在函数调用时再在临时栈帧中分配内存,因此可以全局引用,当然必须有正确的访问权限。
说的不是很清楚,希望LZ明白。
[解决办法]
LZ应该是理解错了,没有返回值不能使用局部变量这一说的,否则你怎么得到处理结果呢?而这与static没有什么因果关系的。
要知道局部变量在超出作用域之后就无效了,因此LZ实际上指的应该是不要返回局部变量的引用,这一点不仅仅在函数调用中要注意的。
例子比如,函数返回内部局部变量的引用,返回局部数组的地址。
[解决办法]
不可以返回指向局部变量的指针,因为 stack 在函数返回前就销毁了
[解决办法]
[解决办法]计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
[解决办法]返回函数的局部变量时出现乱码甚至是没有,原因是函数的局部变量是定义在栈上的,当函数结束时,即返回时,该函数栈上的空间会被编译器自动释放。所以返回的数据是无效的。而加上static后,该“局部”变量就不是在栈上申请空间存放,是在数据段申请空间,并存放。数据段的空间是在程序结束时才会被释放的。
[解决办法]如果在在函数内返回的话加个static 在前面,这样static char s【】就可以了