| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3148 人关注过本帖
标题:字符串常量的生命期与存储域
只看楼主 加入收藏
forice
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2005-8-25
收藏
 问题点数:0 回复次数:8 
字符串常量的生命期与存储域
在书上看到过:
char *str(void)
{
char *p="abc";
return p;
}
main()
{
char *s="efg";
s= str();
printf("%s",s);
}
输出是abc

这程序没有错误,本来我也是一直以为输出是abc 的,但是在看了一本书上说的char *s是字符串常量,它位于静态存储区,在程序的生命期内是恒定不变的,那为什么调用了s=str()这函数后s就变成了abc了?
我就是红色那里不理解,它说的在程序的生命期内恒定不变是指哪个生命期?还有,它说的恒定不变是指什么不变?

[此贴子已经被作者于2006-12-9 11:23:42编辑过]

搜索更多相关主题的帖子: 生命期 常量 字符 
2006-12-09 11:22
爱上夜
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2006-9-12
收藏
得分:0 

*s应该是指针变量啊 不知道你在那看的书 前后文不太清楚


2006-12-09 12:01
longerhe
Rank: 1
等 级:新手上路
帖 子:120
专家分:0
注 册:2006-10-10
收藏
得分:0 

结果是abc啊```编绎过了```

[此贴子已经被作者于2006-12-9 12:06:12编辑过]

2006-12-09 12:03
forice
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2005-8-25
收藏
得分:0 
呃...首先我也知道编译后是什么...
但是我要问的是char *s是字符串常量,它位于静态存储区,在程序的生命期内是恒定不变的,这句应该怎么理解...
还有,,,红色那行字说得没有错误..
现在我就不是很理解它的意思
2006-12-09 12:14
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 

lz红色的那一行有错误,建议再去看看书.

char*声明的是一个指向char型的指针,不是字符串常量(想一下char型指针的申明方式).程序中的"abc"才是字符串常量.

在c语言中用""引起来的字符串叫字符串常量,指针怎么能叫字符串常量呢?

字符串常量的左值是一个指向该字符串的指针,所以char *p="abc";这一句是声明一个char型指针,同时将字符串常量"abc"的首地址赋给该指针.

指针变量s的值是可以改变的,不能改变的是内存中存储字符串常量的内存单元的值.函数char *str(void)返回的是char型指针,s= str();这一句就是将返回值赋给s.

为说明字符串常量的值是不可改变的,可用以下程序验证:
#include<stdio.h>
void main()
{
char *s="efg";
*s='a';/*将'a'写入字符串常量中*/
printf("%s",s);
}
在tc中程序会输出afg没有问题,但是c-free编译的程序会出现内存错误,程序直接崩溃

(我个人是不建议新手用tc的,它给程序员太多的自由,很多语法问题也不报错,而vc要严格的多)

2006-12-09 13:01
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
char *s不是一个指针吗?s当中存放的是"abc"在内存中的首地址。

该学习了。。。
2006-12-09 13:04
senyee
Rank: 1
等 级:新手上路
帖 子:422
专家分:0
注 册:2006-11-28
收藏
得分:0 

是对指针地址指向的改变~
由指向"egf" 的首地址 改为存放"abc"的首地址.......


菜鸟~~请多指教~~
2006-12-09 13:30
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以下是引用forice在2006-12-9 11:22:18的发言:
在书上看到过:
char *str(void)
{
char *p="abc";
return p;
}
main()
{
char *s="efg";
s= str();
printf("%s",s);
}
输出是abc

这程序没有错误,本来我也是一直以为输出是abc 的,但是在看了一本书上说的char *s是字符串常量,它位于静态存储区,在程序的生命期内是恒定不变的,那为什么调用了s=str()这函数后s就变成了abc了?
我就是红色那里不理解,它说的在程序的生命期内恒定不变是指哪个生命期?还有,它说的恒定不变是指什么不变?

人家的意思是S所指的地址是在静态存储区,不是S本身的地址
S开始是EFG,你改变了他指向的地址了
char * const s="efg";这才是指向的地址不变
不过这个程序丢失内存,因为你把S所指地方变了,“EFG”地址丢失,无法释放


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-12-09 13:54
forice
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2005-8-25
收藏
得分:0 
噢..明白..非常感谢
2006-12-09 16:13
快速回复:字符串常量的生命期与存储域
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020980 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved