作者:Jackie
写程序很久,其实一直没有往很深入的地方探讨,很多东西停留在一知半解的阶段,估计肯定是要被同行笑话了。一直都听说不同编译器编译出来的机器指令是不尽相同的,可惜真的是听说而已,没有亲见,今天用strlen测试字符串长度的时候发现了些许不同,于是抓紧记录下来,作为自己学习的一点回忆。
char* pStr = new char[64];
printf("%d\n", strlen(pStr));
delete[] pStr;
pStr = NULL;
结果:
WINXP + VC6.0 编译运行结果68(有点晕,我申请的堆可是64的说)。
LINUX(debian4.0) + g++ 编译运行结果0。
调试:
VC6.0,pStr申请到堆空间后,内容为"屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯 ",32个"吞"以后有4个' ',strlen的结果是68。
g++,pStr内容为空,堆空间里没有内容,strlen的结果是0。
结论:
VC6.0编译器在申请到堆空间以后,并不对堆空间初始化,故堆空间是有内容的,至于为什么后面有4个' ',有待于进一步考证;
g++编译器在申请堆空间以后,将堆空间初始化为0,故运行结果为0。
改正:
将下初始化语句放到内存申请的后面,再次执行就可以得到结果为0效果了。
memset(pstr, NULL, 64);
补充:
如果测试运行的是sizeof(pStr),则结果会是4。