函数可以返回常量字符串常量 函数参数地址吗

Getchar函数从标准输入读取读取一个字符并返回它的值。如果输入中不再存在任何字符,函数就会返回常量EOF(在stdio.h中定义),用于提示文件的结尾。
例:int num = 0;
&&& While(num & max && scanf(“%d”,&columns[num]) == 1&& columns[num] &= 0)
while((ch = getchar()) !=&EOF && ch != ‘\n’)
问:为什么ch被声明为整形,而我们事实上需要他来读取字符?
答:EOF是一个整形值,他的位数比字符类型要多,把ch声明为整形可以防止从输入读取的字符意外地被解释为EOF。但同时,这也意味着接收字符1的ch必须足够大,足以容纳EOF,这就是ch使用整型值的原因。(字符只是小整数而已,所以用一个整型变量容纳字符值并不会引起任何问题)。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:795次
排名:千里之外2012年 总版技术专家分年内排行榜第一
2013年 总版技术专家分年内排行榜第七2011年 总版技术专家分年内排行榜第五2009年 总版技术专家分年内排行榜第九
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。关于函数返回字符串常量的问题 - 博客频道 - CSDN.NET
hust_sheng的专栏
分类:C语言不简单的小知识点
关于函数返回字符串常量的问题
标签(空格分隔):c/c++
首先看下面的代码
using namespace std;
const string& Func()
return "123";
int main()
string s = Func();
cout && s &&
在g++编译下会报错:
很多人会认为是函数Func中的”123”是局部变量,存放于栈中,因为是引用(返回值没有临时变量),函数返回的时候出栈,就会出错,其实不然。
但是,一旦我们将函数Func的返回值类型中的&去掉就可以正常执行。原因如下:
这段代码确实会报错,但是只要把 const string& Func() 中的 & 去掉就可以了。出错的原因并不是”123”在栈中,当函数返回时出栈导致的错误。而是,”123”本身是在静态数据区的,当函数返回时实际返回的是”123”在静态数据区的地址,该地址在函数Func中是局部变量(在栈中),此时,我们使用引用类型返回该局部变量的(但是,会发生出栈操作),我们的引用变量被释放了,就会出错。但是,如果我们不使用 & ,返回的时候我们实际得到的是地址值的中间变量(函数的非引用返回值都会保存在中间变量中),此时栈操作是不影响我们获取正确的地址值的。
hust_sheng
排名:千里之外
(9)(2)(17)(22)(1)(2)(1)(1)(1)(1)(1)(1)匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&一般的来说,函数是可以返回局部变量的。&局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
&&& 下面以函数返回局部变量的指针举几个典型的例子来说明:
这个没有任何问题,因为&hello&world!&是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。
&hello&world!&是局部变量存放在栈中。当returnStr函数退出时,栈要清空,局部变量的内存也被清空了,所以这时的函数返回的是一个已被释放的内存地址,所以有可能打印出来的是乱码。&
局部变量也分局部自动变量和局部静态变量,由于a返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存期从定义起到程序结束。
4:如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型。如下:
5: 数组是不能作为函数的返回值的,原因是编译器把数组名认为是局部变量(数组)的地址。返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。如下:
写的很好! 但是第5点里,“返回一个数组一般用返回指向这个数组的指针代替”, 这里应该是返回指向数组首元素的的指针而不是数组的指针吧。
[c++]
char&*getClassName(void)&&{&&&&&&static&char&className[50]&=&{0};&&&&&&......&&&&&&&&return&&className[0];&&}&&
6:返回指向堆内存的指针是可以的
程序在运行的时候用 malloc 申请任意多少的内存,程序员自己负责在何时用 free释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70800次
积分:2388
积分:2388
排名:第12566名
原创:162篇
转载:48篇
评论:11条
(1)(1)(2)(1)(7)(26)(5)(4)(4)(2)(3)(1)(10)(20)(15)(6)(29)(51)(15)(8)

我要回帖

更多关于 返回字符串的函数 的文章

 

随机推荐