读书人

输出的是什么? 为什么

发布时间: 2012-03-26 15:46:55 作者: rapoo

求救 输出的是什么? 为什么?
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
char *g(void)
{
char p[]="hello world";
return p;

}

void main()
{

char *q=NULL;
q=g();

printf ("%s",q);
}


[解决办法]
g函数中的p是局部变量,出了g函数就不在有效
[解决办法]
输出的不知道。你的指针是在栈里面的。g函数返回后那段内存就被回收了。所以你的指针成了野指针。所以输出什么不知道了
[解决办法]
[return p;]warning C4172: 返回局部变量或临时变量的地址
输出乱码!
[解决办法]
lz是用一个字符串常量来初始化一个字符数组,所以p是栈中的数组,虽然按值返回数组地址,但打印时数组已经被销毁了。
如果改成

C/C++ code
char *p = "hello world";
[解决办法]
我想不会正确输出。因为被调用函数执行结束后,数组p作为局部变量会被系统自动释放,因此不能返回到主函数中。如果你在被调用函数中采用动态申请空间,然后返回指针,那么可以正确输出;因为动态申请的空间是在堆上申请的,被调用函数执行结束后堆上的空间不会被自动释放,需要你在主函数中手动释放--free();
[解决办法]
为什么是个常量?我有点没懂,常量不是要加上const么?
探讨
lz是用一个字符串常量来初始化一个字符数组,所以p是栈中的数组,虽然按值返回数组地址,但打印时数组已经被销毁了。
如果改成

C/C++ code

char *p = "hello world";
的话就能工作了,因为字符串常量是在常量存储区的,不在栈中

[解决办法]
这个问题我也曾遇到过。
返回了个局部的指针,在函数调用完的时候,就被释放掉了;
返回了一个指针,指针指向栈上的东西,但是栈上的东西在函数返回时已经无效了。

可以参考:
http://topic.csdn.net/u/20120228/13/9ce30c42-f5b5-4cb5-a330-0ed3579ebe97.html

读书人网 >C++

热点推荐