用数组存放字符串和用指针存放字符串的区别

1.用数组存取字符串

[cpp]  view plain  copy
 print ?
  1. #include   
  2. void main()  
  3. {  
  4.       char string[] = "Fuck you!";  
  5.         
  6.       printf("%s\n", string);  
  7. }  

在VS在通过反汇编

对应于char string[] = "Fuck you!";语句的汇编代码为

[plain]  view plain  copy
 print ?
  1. 00D113A8  mov         eax,dword ptr [string "Fuck you!" (0D15740h)]    
  2. 00D113AD  mov         dword ptr [ebp-14h],eax    
  3. 00D113B0  mov         ecx,dword ptr ds:[0D15744h]    
  4. 00D113B6  mov         dword ptr [ebp-10h],ecx    
  5. 00D113B9  mov         dx,word ptr ds:[0D15748h]    
  6. 00D113C0  mov         word ptr [ebp-0Ch],dx    

使用32位的寄存器,每次可以存放4个字节。但是CPU寄存器的数量是有限的。于是使用下面的代码再次进行实验。


  

[cpp]  view plain  copy
 print ?
  1. #include   
  2. void main()  
  3. {  
  4.       char string[] = “Fuck you! Fuck you! Fuck you! Fuck you! Fuck you!”;  
  5.         
  6.       printf("%s\n", string);  
  7. }  

对应于char string[] = "Fuck you! Fuck you! Fuck you! Fuck you! Fuck you!";的汇编代码为:

[plain]  view plain  copy
 print ?
  1. 00FA13A8  mov         ecx,0Ch    
  2. 00FA13AD  mov         esi,offset string "Fuck you! Fuck you! Fuck you! Fu"... (0FA5A10h)    
  3. 00FA13B2  lea         edi,[ebp-3Ch]    
  4. 00FA13B5  rep movs    dword ptr es:[edi],dword ptr [esi]    
  5. 00FA13B7  movs        word ptr es:[edi],word ptr [esi]    

语句中的字符串过长以后,对应的存放方式和之前的有些区别了。

当寄存器无法存放下字符串的时候,编译器就使用内存的方式来进行存放了。


2.用指针存取字符串

[cpp]  view plain  copy
 print ?
  1. #include   
  2. void main()  
  3. {  
  4.       char *string = "Fuck you!";  
  5.         
  6.       printf("%s\n", string);  
  7. }  
对应于char *string = "Fuck you!";语句的汇编代码为

[plain]  view plain  copy
 print ?
  1. 0110139E mov dword ptr [string],offset string "Fuck you!" (1105740h)    

这里将"Fuck you!"的偏移地址(1105740h)存放到栈中


你可能感兴趣的:(用数组存放字符串和用指针存放字符串的区别)