zoukankan      html  css  js  c++  java
  • C++基础回顾字符串地址比较

    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; // 输出什么?
    

    输出结果是什么?

    false
    false
    true
    

    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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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<char,std::char_traits<char> >::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  

      

      

  • 相关阅读:
    常用的CSS命名规则 (web标准化设计)
    有哪些概率论和数理统计的深入教材可以推荐?
    CV2X国内现状分析
    隐私计算,新能源汽车“安全上路”的“救命稻草”?
    2022年中国车联网行业全景图谱
    2022年十大AI预测:气候独角兽涌现、中美竞争加剧
    OSEK/VDX介绍
    Adaptive Autosar
    基于我国商密算法的车联网5GV2X通信安全可信体系
    行研篇 | 汽车域控制器研究
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2486000.html
Copyright © 2011-2022 走看看