⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_23231.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:23231 发表者:符号 发表日期:2002-12-02 16:56:42
<br>主题:相同的源文件,在TC3和VC6下的结果为什么不同?
<br>内容:相同的源文件,在TC3和VC6下的结果为什么不同?<BR>下面是源文件:<BR>#include&lt;stdio.h&gt;<BR>void copy_string(char *from,char *to)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;while((*from)!='\0')<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*to=*from;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;*to='\0';<BR>}<BR><BR>void main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *a="I am a teacher.";<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *b="you are a student.";<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("string_a=%s\n string_b=%s\n",a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;copy_string(a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("\nstring_a=%s\nstring_b=%s",a,b);<BR>}<BR>在TC3下的结果<BR>string_a=I am a teacher.<BR>string_b=you are a student.<BR><BR>string_a=I am a teacher.<BR>string_b=I am a teacher.<BR>在VC6下的结果<BR><BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:孟德II 回复日期:2002-12-02 18:23:25
<br>内容:最重要的是由于Windows 2000的内存管理机制不同于Dos模式的内存管理机制;其次是编译器认为下属定义中的a,b是字符串常量:<BR>char *a="I am a teacher.";<BR>char *b="you are a student.";<BR>作为字符串常量的指针,a,b只能读写字符,不能改写字符的内容。<BR>所以执行 *to=*from;时编译器认为这是错误的。<BR>如果你把上述两句改为<BR>char a[]="I am a teacher.";<BR>char b[]="you are a student.";<BR>再次编译时就会正常了。附件是我编译的结果
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2002-12-02 20:10:52
<br>内容:字符指针变量a与b被字符串常量(常量指针)初始化,即a与b当前指向的空间作为常量空间,不能修改,即VC下的*a=*b编译没错,有运行错误。(虽然a与被声明为指针变量,即其可以向其它空间,当指向非常量空间时,可以修改它们指向的空间)。另外还要保证复制的目标有足够的空间,否则也可能出现类似错误。<BR><BR>#include&lt;stdio.h&gt;<BR>#define MAXCHARS&nbsp;&nbsp; 256&nbsp;&nbsp;&nbsp;&nbsp;/*定义目标空间大小*/<BR>void copy_string(char *from,char *to)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;while((*from)!='\0')<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*to=*from;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;*to='\0';<BR>}<BR><BR>void main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;char a[]="I am a teacher.";<BR>&nbsp;&nbsp;&nbsp;&nbsp;char b[MAXCHARS]="you are a student.";&nbsp;&nbsp;/*应确保目标地有足够的空间*/<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("string_a=%s\n string_b=%s\n",a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;copy_string(a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("\nstring_a=%s\nstring_b=%s",a,b);<BR>}<BR><BR>主函数也可写为:<BR>void main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *a="I am a teacher.";<BR>&nbsp;&nbsp;&nbsp;&nbsp;char b[MAXCHARS]="you are a student.";&nbsp;&nbsp;/*应确保目标地有足够的空间*/<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("string_a=%s\n string_b=%s\n",a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;copy_string(a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("\nstring_a=%s\nstring_b=%s",a,b);<BR>}<BR>或<BR>void main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *a="I am a teacher.";<BR>&nbsp;&nbsp;&nbsp;&nbsp;char *b=(char*)malloc(MAXCHARS); /*应确保目标地有足够的空间*/<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("string_a=%s\n string_b=%s\n",a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;copy_string(a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("\nstring_a=%s\nstring_b=%s",a,b);<BR>&nbsp;&nbsp;&nbsp;&nbsp;free(b);<BR>}<BR><BR>这种字符串的拷贝函数也最好同标准函数相同的习惯,即目标参数在前,源串在后,如:<BR>char* stringcopy(char* dest,const char* src);<BR>2002-12-2 20:17:35

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -