当前位置:编程学习 > C/C++ >>

从汇编的角度分析C语言(一)char *p与char p[]的区别

 

C语言代码:

 

 

 

#include <stdlib.h> 

#include <stdio.h> 

 

void main() 

    char array1[] = { "123456" }; 

    char *pointer1 = "123456"; 

汇编代码:

 

 

 

(gdb) disassemble main  

Dump of assembler code for function main: 

   0x08048394 <+0>:     push   %ebp 

   0x08048395 <+1>:     mov    %esp,%ebp 

   0x08048397 <+3>:     sub    $0x10,%esp 

   0x0804839a <+6>:     movl   $0x34333231,-0xb(%ebp) 

   0x080483a1 <+13>:    movw   $0x3635,-0x7(%ebp) 

   0x080483a7 <+19>:    movb   $0x0,-0x5(%ebp) 

   0x080483ab <+23>:    movl   $0x8048484,-0x4(%ebp) 

   0x080483b2 <+30>:    leave   

   0x080483b3 <+31>:    ret     

End of assembler dump. 

(gdb) x/7xb 0x8048484 

0x8048484 <__dso_handle+4>:     0x31    0x32    0x33    0x34    0x35    0x36    0x00 

(gdb)  

从<+6><+13><+19>三行可以看出,程序为array1分配了7bytes的内存空间,用来存储“123456”+‘\0’。

而<+23>行表示将地址0x8048484赋给了pointer1,我们可以查看内存0x8048484之后内容,7bytes正好为“123456”+‘\0’,这里pointer1只是一个指针,并没有为其分配内存单元。

那么下面的这段代码就不难理解了。

 

 

 

#include <stdlib.h> 

#include <stdio.h> 

 

void main() 

    char array1[] = { "123456" }; 

    char array2[] = { "123456" }; 

    char *pointer1 = "123456"; 

    char *pointer2 = "123456"; 

汇编代码:

 

 

(gdb) disassemble main  

Dump of assembler code for function main: 

   0x08048394 <+0>:     push   %ebp 

   0x08048395 <+1>:     mov    %esp,%ebp 

   0x08048397 <+3>:     sub    $0x20,%esp 

   0x0804839a <+6>:     movl   $0x34333231,-0xf(%ebp) 

   0x080483a1 <+13>:    movw   $0x3635,-0xb(%ebp) 

   0x080483a7 <+19>:    movb   $0x0,-0x9(%ebp) 

   0x080483ab <+23>:    movl   $0x34333231,-0x16(%ebp) 

   0x080483b2 <+30>:    movw   $0x3635,-0x12(%ebp) 

   0x080483b8 <+36>:    movb   $0x0,-0x10(%ebp) 

   0x080483bc <+40>:    movl   $0x8048494,-0x4(%ebp) 

   0x080483c3 <+47>:    movl   $0x8048494,-0x8(%ebp) 

   0x080483ca <+54>:    leave    

   0x080483cb <+55>:    ret     

End of assembler dump. 

(gdb) x/7xb 0x8048494 

0x8048494 <__dso_handle+4>:     0x31    0x32    0x33    0x34    0x35    0x36    0x00 

(gdb) 

 

接着这段代码也就顺其自然了!

 

(gdb) disassemble  main  

Dump of assembler code for function main: 

   0x08048394 <+0>:     push   %ebp 

   0x08048395 <+1>:     mov    %esp,%ebp 

   0x08048397 <+3>:     sub    $0x20,%esp 

   0x0804839a <+6>:     movl   $0x34333231,-0xf(%ebp) 

   0x080483a1 <+13>:    movw   $0x3635,-0xb(%ebp) 

   0x080483a7 <+19>:    movb   $0x0,-0x9(%ebp) 

   0x080483ab <+23>:    movl   $0x34333231,-0x16(%ebp) 

   0x080483b2 <+30>:    movw   $0x3635,-0x12(%ebp) 

   0x080483b8 <+36>:    movb   $0x0,-0x10(%ebp) 

   0x080483bc <+40>:    movl   $0x8048494,-0x4(%ebp) 

   0x080483c3 <+47>:    movl   $0x804849b,-0x8(%ebp) 

   0x080483ca <+54>:    leave   

   0x080483cb <+55>:    ret     

End of assembler dump. 

(gdb) x/7xb 0x8048494 

0x8048494 <__dso_handle+4>:     0x31    0x32    0x33    0x34    0x35    0x36    0x00 

(gdb) x/9xb 0x804849b 

0x804849b <__dso_handle+11>:    0x31    0x32    0x33    0x34    0x35    0x36    0x37    0x38 

0x80484a3 <__dso_handle+19>:    0x00 

(gdb)  

 

摘自 sg131971(七夜)的学习笔记

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,