2011-03-07 wcdj
测试代码:
#include <iostream> using namespace std; char* strcpy_(char* strDest,const char* strSrc) { if (strDest==NULL || strSrc == NULL) { return 0; } char *strDestCopy = strDest; while ((*strDest++ = *strSrc++) != '/0') { ; } cout<<strSrc<<endl;// adf (问题处) cout<<strDestCopy<<endl;// 123 return strDestCopy; } int main() { char a[10]="adf"; strcpy_(a,"123"); return 0; }
问题来自原帖 ,很奇怪,VS2008编译上面代码,将strSrc又重置了,还是输出adf。
上述代码用VS2008分别在Debug和Release模式下编译,输出的结果不同。问题是 :Release版本是符合预期的,但是Debug版本却一反常态,与预期不一样,为什么呢? 这个问题出现的本质原因可能在于 :编译器对堆、栈和静态存储区的使用策略,以及VS开发环境对Debug版本和Release版本的处理方式不同。 再测试下面代码:
#include <iostream> using namespace std; char* strcpy_(char* strDest,const char* strSrc) { if (strDest==NULL || strSrc == NULL) { return 0; } char *strDestCopy = strDest; while ((*strDest++ = *strSrc++) != '/0') { ; } cout<<strSrc<<endl;// 不输出adf 了(问题处) cout<<strDestCopy<<endl;// 123 return strDestCopy; } int main() { //char a[10]="adf"; // 改为 char a[10]; a[0]='a'; a[1]='d'; a[2]='f'; a[3]='/0'; strcpy_(a,"123"); return 0; }
更多内容参考:
这位朋友分析的非常详细。 一段奇怪的代码解析