您的位置:首页 > 编程语言

一段代码深入分析

2009-12-05 15:06 169 查看
以下从一个帖子和回复中总结,原贴地址:http://topic.csdn.net/u/20080610/17/b4b77ac2-9bcc-442a-97e7-aee3968dd175.html

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

char a[]="123456789";
char b[]="123";
strcpy(b,a);
printf("%s/n%s/n",a,b);

system("PAUSE");
return 0;
}

为什么以上程序在VC中输出
123456789
123456789
在Dev c++中输出
56789
123456789

正确的代码结果总是一样的
错误的代码结果各不相同

楼主是不是高级语言用多了(C++严格来说应该算中级语言),把a[]和b[]想成太过理想化的数组了。其实a[]和b[]的内存分配和元素增减都是要自己来控制的,不能b=a那么简单,strcpy也不行。

正确的示范:
C/C++ code
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 

  char a[]="123456789"; 
  char b[]="123"; 
  b = new char[strlen(a)+1];
  strcpy(b,a);
  printf("%s/n%s/n",a,b); 
  delete [] b;

  system("PAUSE"); 
  return 0; 
} 

出现 
56789 
123456789情况,内存分布如下: 
1 2 3 0/ 1 2 3 4 5 6 7 8 9 0/ 
|        | 
b        a 

拷贝后: 

1 2 3 4 5 6 7 8 9 0/ 7 8 9 0/ 
|      | 
b      a 

a="56789" 
b="123456789" 
说清楚嘛。。 

让我们来看这段程序在VC6下的反汇编代码: 
Assembly code [code]13:       char a[]="123456789";
00401028 A1 30 40 42 00       mov         eax,[string "123456789" (00424030)]
0040102D 89 45 F4             mov         dword ptr [ebp-0Ch],eax
00401030 8B 0D 34 40 42 00    mov         ecx,dword ptr [string "123456789"+4 (00424034)]
00401036 89 4D F8             mov         dword ptr [ebp-8],ecx
00401039 66 8B 15 38 40 42 00 mov         dx,word ptr [string "123456789"+8 (00424038)]
00401040 66 89 55 FC          mov         word ptr [ebp-4],dx
14:       char b[]="123";
00401044 A1 2C 40 42 00       mov         eax,[string "123" (0042402c)]
00401049 89 45 F0             mov         dword ptr [ebp-10h],eax
15:       strcpy(b,a);
0040104C 8D 4D F4             lea         ecx,[ebp-0Ch]
0040104F 51                   push        ecx
00401050 8D 55 F0             lea         edx,[ebp-10h]
00401053 52                   push        edx
00401054 E8 F7 01 00 00       call        strcpy (00401250)
00401059 83 C4 08             add         esp,8
16:       printf("%s/n%s/n",a,b);
0040105C 8D 45 F0             lea         eax,[ebp-10h]
0040105F 50                   push        eax
00401060 8D 4D F4             lea         ecx,[ebp-0Ch]
00401063 51                   push        ecx
00401064 68 24 40 42 00       push        offset string "%s/n%s/n" (00424024)
00401069 E8 62 01 00 00       call        printf (004011d0)
0040106E 83 C4 0C             add         esp,0Ch
17:
18:       system("PAUSE");
00401071 68 1C 40 42 00       push        offset string "PAUSE" (0042401c)
00401076 E8 45 00 00 00       call        system (004010c0)
0040107B 83 C4 04             add         esp,4
19:       return 0;


可以单步运行观察a和b所指向内存的变化情况,
或者在strcpy(b,a);这一句设个断点,停下来后
观察a和b所指向内存的位置,用逻辑思维推导出结果。

在我机器上watch到的a和b的值:

Name    Value
a      0x0012ff74 "123456789"
b      0x0012ff70 "123"

strcpy()后,a和b所指向的字符串,它们的内存重叠了。[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: