谭浩强书中一例题的疑问

swordlord 2008-01-25 01:42:17
谭书10.4.2节中例10.20用函数调用实现字符串的复制
#include<stdio.h>
void copy_string(char *from, char *to)
{
int i = 0;
while(*(from+i) != '\0'){
*(to+i) = *(from+i);
i++;
}
*(to+i) = '\0';
}

void main()
{
char *a = "I am a teacher.";
char *b = "you are a student.";
printf("string a = %s\nstring b = %s\n", a, b);
copy_string(a, b);
printf("\nstring a = %s\nstring b = %s", a, b);
getch();
}
我在VIUAL C++ 6.0中编译通过,但运行出现问题,只执行了第一个打印函数.并出现错误信息对话框:"example10_20.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。"
但相同的代码在TC2.0下可以正常运行.

在VIUAL C++ 6.0中如果将char *a = "I am a teacher.";char *b = "you are a student.";改为char a[] = "I am a teacher."; char b[] = "you are a student.";则可以正常运行.

请大家帮忙分析下怎么回事?
...全文
225 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyjsjcom 2008-01-25
  • 打赏
  • 举报
回复
http://download.csdn.net/user/zzyjsjcom/All/4
Chanv 2008-01-25
  • 打赏
  • 举报
回复
感受了下 系统语言的 奥妙
wangfengLLD 2008-01-25
  • 打赏
  • 举报
回复
char *a = "I am a teacher.";
char *b = "you are a student.";
其实定义的是两个常量
不能改变"I am a teacher."和"you are a student."的值
而只能对a和b重新赋值
即只能:
a = "wfwfwfwf";
b = "erererer";
而不能:
*(a+1) = *(b+1);


Mnky 2008-01-25
  • 打赏
  • 举报
回复
不是*a的问题,明明是*b的问题啊!!!
char *b = "you are a student.";
*b指向一个常量区,是不能改变的,相当于 b 被 const char *b了一样。
当然这也看编译器,如果编译器不把*b分配在常量区,就可以。

谭浩强出书的时候,可能用的TC吧。
qww_5 2008-01-25
  • 打赏
  • 举报
回复
binglovehong 正解
a和b只是指向一个常量区,常量区的值是不可以修改的!
xub666 2008-01-25
  • 打赏
  • 举报
回复
VC在编译时,对于预先指定了值的字符串指针是连续分配内存的,故在你的过程里面,将一个长字符串的值取出来放入短字符串的时候,当你的指针移动的位置超出短字符串最长长度时,实际就写到了程序的源代码的位置,会提示出错.而将短中入入长串则不会出错.对于不确定长度的字符串处理的最好方法是采用动太内存实现.(浅见仅供参考)
swordlord 2008-01-25
  • 打赏
  • 举报
回复
感谢各位热心解答!
我感觉这个问题可能是TC与VC6.0对于char *a的处理机制有些不同.
看来这个问题短期之内我还无法搞明白. 有待进一步学习.先把老谭的书看完再说.
bloodstars 2008-01-25
  • 打赏
  • 举报
回复
可能一个是c++,一个是c,编译过程中可能对数据安排不一样,反正C++是将两个字符串放到了main函数的活动记录当中,变更可能破坏活动记录,C好象是将字符传放到景泰存储区,看编译器如何实现了
bloodstars 2008-01-25
  • 打赏
  • 举报
回复
a,b 都是处于栈中的,附值过程中如果超出a,b的长度可能会破坏main函数的活动记录,这是致命的,
binglovehong 2008-01-25
  • 打赏
  • 举报
回复
因为char *a = "I am a teacher" 内的“I am a teacher”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。指针a始终是同一个“只读”的内存。
使用char a[],会在栈上建立连续的内存空间,大小恰好容下"I am a teacher"字符串。进行指针++,赋值等操作就可以对数组的成员依次赋值。可以达到字符串赋值的目的。
至于VC,TC的区别,可以在于VC下进行操作时会影响到操作系统占用的内存吧。
shaoze5 2008-01-25
  • 打赏
  • 举报
回复
你这个问题其实就是指针和数组的区别,在vc6.0下就算改成1楼的写法也不对的!
还有个办法,可以让vc6.0下可以做!就是打开你的编译选项将/ZI改成/Zi,应该就可以了。
不过这个问题还是不要这样使用的好,还是改成数组做,这就有个问题了,就是不要越位处理就好了!
v风雪山神庙v 2008-01-25
  • 打赏
  • 举报
回复
char *a在tc中可看作字符串,在VC++中看作字符指针
  • 打赏
  • 举报
回复
char *a = "I am a teacher."这样写不对
应该是
const char *a="I am a teacher."

70,031

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧