一段代码深入分析
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
可以单步运行观察a和b所指向内存的变化情况,
或者在strcpy(b,a);这一句设个断点,停下来后
观察a和b所指向内存的位置,用逻辑思维推导出结果。
在我机器上watch到的a和b的值:
Name Value
a 0x0012ff74 "123456789"
b 0x0012ff70 "123"
strcpy()后,a和b所指向的字符串,它们的内存重叠了。[/code]
#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]
相关文章推荐
- 机器学习(11.4)--神经网络(nn)算法的深入与优化(4) -- CorssEntropyCost(交叉熵代价函数)数理分析与代码实现
- 《网络渗透技术》学习笔记(3)——一段穿透防火墙的Shellcode汇编代码分析 zz
- 用正则分析一段vb代码含有哪些过程或者函数
- Tripleo之nova-compute 和Ironic的代码深入分析(四)
- WEP,WPA-PSK,WPA2-PSK握手深入分析3--wpa_supplicant代码分析-扫描
- 一段反 ASM 代码分析。。
- 一段经典的javascript代码分析
- 深入Xerces代码分析DOM结构的创建过程
- 【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)
- js中闭包来实现bind函数的一段代码的分析
- [李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--PHP脚本的执行 词法分析和语法分析
- 一段流量分析工具代码
- 多线程程序一段问题代码分析
- 深入分析:C++模板究竟会使代码膨胀吗
- u-boot-2014.10移植第7天----深入分析代码(二)
- 手机开发之二:Boot代码深入分析
- 【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)
- 深入分析S3C2440启动代码中大小端问题
- 由一段 “javascript css 照片切换代码” 引发的深入研究
- SVNKIT一段代码的分析