华为比试的一道题
很简单的题目
char *func(void)
{
char *str= "ABC ";
return str;
}
void Test()
{
char *p=NULL;
p=func();
print(p);
}
问:运行Test函数后的输出是什么?
输出应该是ABC,但是这样做有什么危害呢?
[解决办法]
危害嘛,首先字符串常量“ABC "保存在程序静态存储区,整个程序运行过程中都存在,浪费空间,这里不明显.
另一个是,你返回的是一个指向 常量的指针,但是语法层没有限制,也就是通过p修改字符串内容这样的动作 编译可以通过,但是明显程序会down掉
[解决办法]
很简单的题目
char *func(void)
{ char *str= "ABC ";
return str;}
void Test()
{ char *p=NULL;
p=func();
print(p);}
问:运行Test函数后的输出是什么?输出应该是ABC,但是这样做有什么危害呢?
----------------------------------
错用指针,Test函数后的输出的结果不一定是ABC!!
其实危害到没有什么,因为你在 print(p);时p保存的地址已经标记为不使用。
对于读取非法内存算是危害。非法写显然是危害。
一个同样的例子:http://community.csdn.net/Expert/topic/5378/5378928.xml?temp=5.083865E-02
//错用指针,函数的值传递和引用传递,引用传递就是
//直接修改参数变量内容,楼主把指针用反了,指针指向的变量应该在main函数等
//调用的函数中,而楼主却把分配变量放到被调函数中,等函数返回后你的p;
//得到了地址没错,可是因为被调函数一经返回,所有分配的变量就被释放。内容是不是
//会被改变很难说,即时你上面的程序正确运行、结果正确,这种设计也是错误的。
//应该把变量定义在主调函数中,然后用指针作参数。