C-数组、参数反汇编

返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"

char fun()
{
char x=3;
return x;

}

int main(int argc, char* argv[])
{
int y=fun();
return 0;

}

image-20231106140427059

image-20231106140614012

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"

__int64 fun()
{
__int64 x=3;
return x;

}

int main(int argc, char* argv[])
{
__int64 y=fun();
return 0;

}

image-20231106140855415

局部变量

函数调用的时候编译器会提升堆栈分配新的内存空间,栈顶ESP提升的空间就被称为缓冲区,不同的编译器会分配不同的默认空间

参数在函数调用前就已经分配了内存空间,局部变量只有当函数调用后才会分配空间

参数

参数传递本质就是将上层函数的变量或者表达式的值复制一份传给下层函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"

char fun(char x)
{
x+=1;
return x;

}

int main(int argc, char* argv[])
{
int x=1;
char y=fun(x);
return 0;

}

image-20231106141334069

数组

数组定义必须使用正整数,不能使用变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"

void fun()
{
char arr[4]={1,2,5,3};


}

int main(int argc, char* argv[])
{
fun();
return 0;

}

image-20231106141515390

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"

void fun()
{
char a=1;


}

int main(int argc, char* argv[])
{
fun();
return 0;

}

数组空间分配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "stdafx.h"

void fun()
{
int arr[10]={1,2,5,3,2,2,3,3,4,6};


}

int main(int argc, char* argv[])
{
fun();
return 0;

}

0040B7C8 mov dword ptr [ebp-28h],1
0040B7CF mov dword ptr [ebp-24h],2
0040B7D6 mov dword ptr [ebp-20h],5
0040B7DD mov dword ptr [ebp-1Ch],3
0040B7E4 mov dword ptr [ebp-18h],2
0040B7EB mov dword ptr [ebp-14h],2
0040B7F2 mov dword ptr [ebp-10h],3
0040B7F9 mov dword ptr [ebp-0Ch],3
0040B800 mov dword ptr [ebp-8],4
0040B807 mov dword ptr [ebp-4],6

桶排序

使用场景:需要排序的数组最大数不能太大

原理:将所排序数组的最大数加一,作为辅助数组的下标,排序数组的数值出现一次,辅助数组的的下标加一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "stdafx.h"

void fun()
{
int arr[10]={1,2,5,3,2,2,3,3,4,6};
int trr[7]={0};
int t=0;

for(int i =0;i<10;i++)
{
trr[arr[i]]=trr[arr[i]]+1;
}

for(int j=0;j<7;j++)
{
t=trr[j];
while(t>0)
{
printf("%d ",j);
t--;
}
}

}

int main(int argc, char* argv[])
{
fun();
return 0;

}

image-20231106143459243