汇编的角度分析C语言多维数组

 

 反汇编:

8:
9:        int arr[3][4] = {
10:       {1,2,3,4},
00401038   mov         dword ptr [ebp-30h],1
0040103F   mov         dword ptr [ebp-2Ch],2
00401046   mov         dword ptr [ebp-28h],3
0040104D   mov         dword ptr [ebp-24h],4
11:       {5,6,7,8},
00401054   mov         dword ptr [ebp-20h],5
0040105B   mov         dword ptr [ebp-1Ch],6
00401062   mov         dword ptr [ebp-18h],7
00401069   mov         dword ptr [ebp-14h],8
12:       {9,7,6,5}
00401070   mov         dword ptr [ebp-10h],9
00401077   mov         dword ptr [ebp-0Ch],7
0040107E   mov         dword ptr [ebp-8],6
00401085   mov         dword ptr [ebp-4],5
13:   };
14:   }

 

2、给定部分值        
        
int arr[3][4] = {        
        
    {1,2},    
    {5},    
    {9}    
} 
反汇编:

8: int arr[3][4] = {
9:
10: {1,2},
0040D7AE mov dword ptr [ebp-30h],1
0040D7B5 mov dword ptr [ebp-2Ch],2
0040D7BC xor eax,eax
0040D7BE mov dword ptr [ebp-28h],eax
0040D7C1 mov dword ptr [ebp-24h],eax
11: {5},
0040D7C4 mov dword ptr [ebp-20h],5
0040D7CB xor ecx,ecx
0040D7CD mov dword ptr [ebp-1Ch],ecx
0040D7D0 mov dword ptr [ebp-18h],ecx
0040D7D3 mov dword ptr [ebp-14h],ecx
12: {9}
0040D7D6 mov dword ptr [ebp-10h],9
0040D7DD xor edx,edx
0040D7DF mov dword ptr [ebp-0Ch],edx
0040D7E2 mov dword ptr [ebp-8],edx
0040D7E5 mov dword ptr [ebp-4],edx
13: };
14:

int arr2[3][4] = {        
        
    {1,2,3,4,5},    
    {5},    
    {9}    
}     

反汇编:

15: int arr2[3][4] = {
16:
17: {1,2,3,4},
0040D7E8 mov dword ptr [ebp-60h],1
0040D7EF mov dword ptr [ebp-5Ch],2
0040D7F6 mov dword ptr [ebp-58h],3
0040D7FD mov dword ptr [ebp-54h],4
18: {5},
0040D804 mov dword ptr [ebp-50h],5
0040D80B xor eax,eax
0040D80D mov dword ptr [ebp-4Ch],eax
0040D810 mov dword ptr [ebp-48h],eax
0040D813 mov dword ptr [ebp-44h],eax
19: {9}
0040D816 mov dword ptr [ebp-40h],9
0040D81D xor ecx,ecx
0040D81F mov dword ptr [ebp-3Ch],ecx
0040D822 mov dword ptr [ebp-38h],ecx
0040D825 mov dword ptr [ebp-34h],ecx
20: };


3、省略里面的{ }                    
                    
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};     
反汇编:

8: int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
0040D7AE mov dword ptr [ebp-30h],1
0040D7B5 mov dword ptr [ebp-2Ch],2
0040D7BC mov dword ptr [ebp-28h],3
0040D7C3 mov dword ptr [ebp-24h],4
0040D7CA mov dword ptr [ebp-20h],5
0040D7D1 mov dword ptr [ebp-1Ch],6
0040D7D8 mov dword ptr [ebp-18h],7
0040D7DF mov dword ptr [ebp-14h],8
0040D7E6 mov dword ptr [ebp-10h],9
0040D7ED mov dword ptr [ebp-0Ch],0Ah
0040D7F4 mov dword ptr [ebp-8],0Bh
0040D7FB mov dword ptr [ebp-4],0Ch

int arr2[3][4] = {1,2,3,4,5,6,7,8,9,10};                    
反汇编:

10: int arr2[3][4] = {1,2,3,4,5,6,7,8,9,10};
0040D802 mov dword ptr [ebp-60h],1
0040D809 mov dword ptr [ebp-5Ch],2
0040D810 mov dword ptr [ebp-58h],3
0040D817 mov dword ptr [ebp-54h],4
0040D81E mov dword ptr [ebp-50h],5
0040D825 mov dword ptr [ebp-4Ch],6
0040D82C mov dword ptr [ebp-48h],7
0040D833 mov dword ptr [ebp-44h],8
0040D83A mov dword ptr [ebp-40h],9
0040D841 mov dword ptr [ebp-3Ch],0Ah
0040D848 xor eax,eax
0040D84A mov dword ptr [ebp-38h],eax
0040D84D mov dword ptr [ebp-34h],eax
11: }


                        
    4、省略长度                    
                        
    int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 

8: int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
0040D7AE mov dword ptr [ebp-30h],1
0040D7B5 mov dword ptr [ebp-2Ch],2
0040D7BC mov dword ptr [ebp-28h],3
0040D7C3 mov dword ptr [ebp-24h],4
0040D7CA mov dword ptr [ebp-20h],5
0040D7D1 mov dword ptr [ebp-1Ch],6
0040D7D8 mov dword ptr [ebp-18h],7
0040D7DF mov dword ptr [ebp-14h],8
0040D7E6 mov dword ptr [ebp-10h],9
0040D7ED mov dword ptr [ebp-0Ch],0Ah
0040D7F4 mov dword ptr [ebp-8],0Bh
0040D7FB mov dword ptr [ebp-4],0Ch

 

 

 

int arr[3][4] = {1,2,3,4,5,6,7,8,9,10};     

10: int arr2[3][4] = {1,2,3,4,5,6,7,8,9,10};
0040D802 mov dword ptr [ebp-60h],1
0040D809 mov dword ptr [ebp-5Ch],2
0040D810 mov dword ptr [ebp-58h],3
0040D817 mov dword ptr [ebp-54h],4
0040D81E mov dword ptr [ebp-50h],5
0040D825 mov dword ptr [ebp-4Ch],6
0040D82C mov dword ptr [ebp-48h],7
0040D833 mov dword ptr [ebp-44h],8
0040D83A mov dword ptr [ebp-40h],9
0040D841 mov dword ptr [ebp-3Ch],0Ah
0040D848 xor eax,eax
0040D84A mov dword ptr [ebp-38h],eax
0040D84D mov dword ptr [ebp-34h],eax

 

 

 

int arr[3][4] = {1,2,3,4,5,6,7,8,9}; 

12: int arr3[3][4] = {1,2,3,4,5,6,7,8,9};
0040D850 mov dword ptr [ebp-90h],1
0040D85A mov dword ptr [ebp-8Ch],2
0040D864 mov dword ptr [ebp-88h],3
0040D86E mov dword ptr [ebp-84h],4
0040D878 mov dword ptr [ebp-80h],5
0040D87F mov dword ptr [ebp-7Ch],6
0040D886 mov dword ptr [ebp-78h],7
0040D88D mov dword ptr [ebp-74h],8
0040D894 mov dword ptr [ebp-70h],9
0040D89B xor ecx,ecx
0040D89D mov dword ptr [ebp-6Ch],ecx
0040D8A0 mov dword ptr [ebp-68h],ecx
0040D8A3 mov dword ptr [ebp-64h],ecx


5、为什么要使用二维数组:更加直观                        
                        
比如:一年有12个月,每个月都有一个平均气温,存储5年的数据                        
                        
int arr[5][12] = {                        
                    arr[1][5]    
    {1,2,1,4,5,6,7,8,9,1,2,3}            //0        
                        
    {1,2,1,4,5,6,7,8,9,1,2,3}            //1        
                        
    {1,2,1,4,5,6,7,8,9,1,2,3}            //2        
                        
    {1,2,1,4,5,6,7,8,9,1,2,3}            //3        
                        
    {1,2,1,4,5,6,7,8,9,1,2,3}            //4        
                        
}                        

 

 

 

数组越界:

  

void HelloWord()            
{            
    printf("Hello World");        
            
    getchar();        
}            
void Fun()            
{            
    int arr[5] = {1,2,3,4,5};        
            
    arr[6] = (int)HelloWord;        
            
}            

  总结:

  数组是允许越界的,arr[6]存的是函数的地址,也就是指针

posted @ 2020-12-31 19:10  heyhx  阅读(172)  评论(0编辑  收藏  举报