滴水逆向 02-03 多维数组
二维数组
-
一维数组与多维数组在反汇编上没有区别
1
2
3
4
5
6
7
8void Fun() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
//int arr[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
}两种写法汇编是一样的:

-
数量如果不够,其他的会用 0 补全
1
2
3
4
5
6
7void Fun() {
int arr[3][4] = {
{1, 2},
{5},
{9}
};
}
与普通的变量赋值不同,我们知道如果不给定初始值,全局变量默认初值 0,局部变量则是随机(残留的垃圾数据)。但是数组不一样,但凡定义了数组中的一个值,其余的值编译器就都会自动赋 0 了,可以联想到很常见的一个给数组赋初值的语句:int arr[100] = {0}; -
不允许超过维度的最大长度
-
可以省略里面的 {}
1
int arr[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
-
可以省略第一维的值(第二维不可以省略)
1
int arr[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
课后作业
前五题就不做了,直接看一下第六题
-
数组一:[3, 5, 7, 9, 12, 25, 34, 55],数组二:[4, 7, 9, 11, 13, 16]。将两个数组中的所有数据进行从小到大的排序,存储到另一个数组中观察到两个数组内的数据都是有序的,所以就省事了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Func() {
int arr1[8] = {3, 5, 7, 9, 12, 25, 34, 55};
int arr2[6] = {4, 7, 9, 11, 13, 16};
int arr[14] = {0};
int cnt = 0, cnt1 = 0, cnt2 = 0;
while (cnt1 < 8 && cnt2 < 6) {
if (arr1[cnt1] <= arr2[cnt2]) arr[cnt++] = arr1[cnt1++];
else arr[cnt++] = arr2[cnt2++];
}
while (cnt1 < 8) arr[cnt++] = arr1[cnt1++];
while (cnt2 < 6) arr[cnt++] = arr2[cnt2++];
int i;
for (i = 0; i < 14; i++) printf("%d ", arr[i]);
}
int main(int argc, char* argv[]) {
Func();
return 0;
}