博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++基础回顾-字符串地址比较
阅读量:5322 次
发布时间:2019-06-14

本文共 4428 字,大约阅读时间需要 14 分钟。

char str1[]       = "abc";char str2[]       = "abc";const char str3[] = "abc"; const char str4[] = "abc"; const char* str5  = "abc";const char* str6  = "abc";cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?

输出结果是什么?

falsefalsetrue

why?反汇编看看

char str1[]       = "abc";00CD163E  mov         eax,dword ptr [string "abc" (0CD9A40h)]  //将abc字符串(静态地址)00CD1643  mov         dword ptr [str1],eax //str1地址 0x0018fd00 	char str2[]       = "abc";00CD1646  mov         eax,dword ptr [string "abc" (0CD9A40h)]  00CD164B  mov         dword ptr [str2],eax  //str2地址 0x0018fcf4 	const char str3[] = "abc"; 00CD164E  mov         eax,dword ptr [string "abc" (0CD9A40h)]  00CD1653  mov         dword ptr [str3],eax  //str3地址 0x0018fce8	const char str4[] = "abc"; 00CD1656  mov         eax,dword ptr [string "abc" (0CD9A40h)]  00CD165B  mov         dword ptr [str4],eax  //str4地址 0x0018fcdc	const char* str5  = "abc";00CD165E  mov         dword ptr [str5],offset string "abc" (0CD9A40h)  //str5指向0CD9A40h	const char* str6  = "abc";00CD1665  mov         dword ptr [str6],offset string "abc" (0CD9A40h)  //str6指向0CD9A40h	cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?00CD166C  mov         esi,esp  00CD166E  mov         eax,dword ptr [__imp_std::endl (0CDD31Ch)]  00CD1673  push        eax  00CD1674  lea         ecx,[str1]  00CD1677  lea         edx,[str2]  00CD167A  cmp         ecx,edx  00CD167C  sete        al  00CD167F  mov         edi,esp  00CD1681  movzx       ecx,al  00CD1684  push        ecx  00CD1685  mov         ebx,esp  00CD1687  push        offset std::boolalpha (0CD1113h)  00CD168C  mov         ecx,dword ptr [__imp_std::cout (0CDD318h)]  00CD1692  call        dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD30Ch)] 00CD1698 cmp ebx,esp 00CD169A call @ILT+505(__RTC_CheckEsp) (0CD11FEh) 00CD169F mov ecx,eax 00CD16A1 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD308h)] 00CD16A7 cmp edi,esp 00CD16A9 call @ILT+505(__RTC_CheckEsp) (0CD11FEh) 00CD16AE mov ecx,eax 00CD16B0 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD310h)] 00CD16B6 cmp esi,esp 00CD16B8 call @ILT+505(__RTC_CheckEsp) (0CD11FEh) cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?00CD16BD mov esi,esp 00CD16BF mov eax,dword ptr [__imp_std::endl (0CDD31Ch)] 00CD16C4 push eax 00CD16C5 lea ecx,[str3] 00CD16C8 lea edx,[str4] 00CD16CB cmp ecx,edx 00CD16CD sete al 00CD16D0 mov edi,esp 00CD16D2 movzx ecx,al 00CD16D5 push ecx 00CD16D6 mov ebx,esp 00CD16D8 push offset std::boolalpha (0CD1113h) 00CD16DD mov ecx,dword ptr [__imp_std::cout (0CDD318h)] 00CD16E3 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD30Ch)] 00CD16E9 cmp ebx,esp 00CD16EB call @ILT+505(__RTC_CheckEsp) (0CD11FEh) 00CD16F0 mov ecx,eax 00CD16F2 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD308h)] 00CD16F8 cmp edi,esp 00CD16FA call @ILT+505(__RTC_CheckEsp) (0CD11FEh) 00CD16FF mov ecx,eax 00CD1701 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD310h)] 00CD1707 cmp esi,esp 00CD1709 call @ILT+505(__RTC_CheckEsp) (0CD11FEh) cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?00CD170E mov esi,esp 00CD1710 mov eax,dword ptr [__imp_std::endl (0CDD31Ch)] 00CD1715 push eax 00CD1716 mov ecx,dword ptr [str5] 00CD1719 cmp ecx,dword ptr [str6] 00CD171C sete dl 00CD171F mov edi,esp 00CD1721 movzx eax,dl 00CD1724 push eax 00CD1725 mov ebx,esp 00CD1727 push offset std::boolalpha (0CD1113h) 00CD172C mov ecx,dword ptr [__imp_std::cout (0CDD318h)] 00CD1732 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD30Ch)] 00CD1738 cmp ebx,esp 00CD173A call @ILT+505(__RTC_CheckEsp) (0CD11FEh) 00CD173F mov ecx,eax 00CD1741 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD308h)] 00CD1747 cmp edi,esp 00CD1749 call @ILT+505(__RTC_CheckEsp) (0CD11FEh) 00CD174E mov ecx,eax 00CD1750 call dword ptr [__imp_std::basic_ostream
>::operator<< (0CDD310h)] 00CD1756 cmp esi,esp 00CD1758 call @ILT+505(__RTC_CheckEsp) (0CD11FEh)

 

所以这里

 

str1(0x0018fd00)!=str2(0x0018fcf4)

 

str3(0x0018fce8)!=str4(0x0018fcdc)

str5(0x0CD9A40h)==str6(0x0CD9A40h)

结果为

false

false

true  

 

 

 

  

  

转载于:https://www.cnblogs.com/SkyMouse/archive/2012/05/06/2486000.html

你可能感兴趣的文章
pcie dma的玩法
查看>>
BZOJ1043 [HAOI2008]下落的圆盘
查看>>
SqlDbx连接oracle(无需安装Oracle客户端)
查看>>
关于Membership和身份认证的记录
查看>>
斐波拉契数列
查看>>
PLAY2.6-SCALA(十) 模板引擎Twirl
查看>>
Junit单元测试初级(一)
查看>>
OC 方法声明使用
查看>>
mysql复习笔记
查看>>
通过JDBC连接hive
查看>>
leetcode 144. Binary Tree Preorder Traversal
查看>>
[杂项] 知识综合运用
查看>>
PostgreSQL的 initdb 源代码分析之十三
查看>>
对pgpoo-II的pool_process_context的 proc_id 的理解
查看>>
Appium移动自动化测试-----(十)appium API 之上下文操作
查看>>
【转】STL中的set容器的一点总结
查看>>
js的转换函数
查看>>
短信发送AZDG加密算法
查看>>
根据表生成流水号
查看>>
实验三
查看>>