如同诚心对待上帝一样诚心求教!!!!!基础问题

isfirestar 2008-03-10 01:04:36
很基础的问题,小羊已经手上无分可送,请各位大虾不吝赐教,以下两个字符串究竟哪里不同了?为什么C写的结果会那么异常呢?
用标准库的函数当然没问题,我很想知道下面这个函数到底怎么个不对法,谢谢.
/*结果:
string:ABCDE烫烫烫誊? length:15 size:5
string:ABCDE length:5 size:5
*/
#include <stdio.h>
#include <conio.h>
#include <string.h>

void foo_forc()
{
char buf[5];
int nChar=0x41;
memset(buf,0,5);
for(int i=0;i<5;i++)
{
buf[i]=(char)nChar;
nChar++;
}
printf("string:%s\tlength:%d\tsize:%d\n",buf,(int)strlen(buf),sizeof(buf));
getch();
}

void foo_forasm()
{
char buf[5];
__asm
{
lea edi,buf
mov eax,41h
mov ecx,05h
lo:
mov [edi],eax
inc eax
inc edi
loop lo
}
printf("string:%s\tlength:%d\tsize:%d\n",buf,(int)strlen(buf),sizeof(buf));
getch();
}

void main()
{
foo_forc();
foo_forasm();
}


...全文
57 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
isfirestar 2008-03-11
  • 打赏
  • 举报
回复
非常感激您的提点
lay6 2008-03-10
  • 打赏
  • 举报
回复
c版本代码,buf字符串没有结束符'\0',导致不确定的结果
asm版本,mov [edi],eax,实际上是把0x00000041,0x00000042。。。。0x00000045写入buf,最后buf中的数据应该是0x41,0x42,0x43,0x44,0x45,0x00,0x00,0x00

实际上,asm版本会造成缓冲区溢出。。。楼主的结果可能是在编译器为栈保留空间的情况下得到的。。。。。

64,849

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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