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  

      

      

  • 相关阅读:
    c++ heap学习
    超长正整数相加
    Search Insert Position
    strcpy与strcat函数原型
    C++基本数据类型占字节数
    详解指针的指针
    Google 超分辨率技术 RAISR
    elementui resetFields方法重置表单失败
    VS 点击文件自动定位到解决方案资源管理器中文件所在目录位置
    mybatis中LIKE模糊查询的几种写法以及注意点
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2486000.html
Copyright © 2011-2022 走看看