内存覆盖问题
关于静态数据区的数据修改以及覆盖,在debug 模式不能通过的,在release 模式正常运行。
cin>>i;
char* str1="56789";
char* str2="123456789";
strcpy(str1,str2);
cin>>i;
cout<<str1<<endl;
cout<<str2<<endl;
0040108E call 00401770 //cin Call
00401093 mov edi,4190F4h //str1开始地址
00401098 or ecx,0FFh
0040109B xor eax,eax
0040109D repne scas byte ptr [edi]
0040109F not ecx
004010A1 sub edi,ecx //结果是edi回到4190F4h
004010A3 lea eax,[esp+0Ch]
004010A7 mov edx,ecx
004010A9 mov esi,edi
004010AB mov edi,4190ECh
004010B0 push eax
004010B1 shr ecx,2
004010B4 rep movs dword ptr [edi],dword ptr [esi] //操作后结果为:内存变化[1]
004010B6 mov ecx,edx
004010B8 and ecx,3
004010BB rep movs byte ptr [edi],byte ptr [esi] //操作后结果为:内存变化[2]
004010BD mov ecx,41B058h
004010C2 call 00401770 //cin Call
004010C7 push 4190ECh
004010CC push 41AFC8h
004010D1 call 00401F90
004010D6 add esp,8
004010D9 mov esi,eax
004010DB mov ecx,esi
004010DD push 0Ah
004010DF call 00401600
004010E4 mov ecx,dword ptr [esi]
004010E6 mov bl,6
004010E8 xor edi,edi
004010EA mov edx,dword ptr [ecx+4]
004010ED mov cl,byte ptr [edx+esi+4]
004010F1 test bl,cl
004010F3 lea eax,[edx+esi]
004190EC 35 36 37 38 5678 //str1
004190F0 39 00 00 00 9
004190F4 31 32 33 34 1234 //str2
004190F8 35 36 37 38 5678
004190FC 39 00 00 00 9
//内存变化[1]*****************************
004190EC 31 32 33 34 1234
004190F0 35 36 37 38 5678
004190F4 31 32 33 34 1234
004190F8 35 36 37 38 5678
004190FC 39 00 00 00 9
//内存变化[2]*****************************
004190EC 31 32 33 34 1234
004190F0 35 36 37 38 5678
004190F4 39 00 33 34 9.34
004190F8 35 36 37 38 5678
004190FC 39 00 00 00 9
输出结果为:
123456789
9
据说是华为的笔试题目!
char* str1="56789";
char* str2="123456789";
和
char* str2="123456789";
char* str1="56789";
在静态数据区分配内存,都是"56789"位于"123456789"前面,据说是编译器对静态数据区内存做了优化。