二进制C-缓冲区溢出与多维数组
xiu缓冲区溢出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include "stdafx.h"
void p() { printf("hello world");
getchar(); }
void fun() { int arr[5]={1,2,5,3,2}; arr[5]=0x12345678; }
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
| #include "stdafx.h"
void p() { printf("hello world");
getchar(); }
void fun() { int arr[5]={1,2,5,3,2}; arr[6]=(int)p; }
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
| void fun() {
int arr[12]={1,2,3,4,5,6,7,8,9}; }
int main(int argc, char* argv[]) { fun(); return 0;
}
|

从内存分配上数组没有本质区别,编译器会根据两个中括号相乘的大小分配总空间,多维数组的分配可以简写
int arr[][3]={1,2,3,4,5,6,7,8,9};
可以省略第一个中括号的内容,编译器会根据一组四个人自动计算好有几个组,但是不能省略第二个中括号,只告诉编译器几组是没法分配空间的;
数组寻址
多维数组没有行的概念,所有的数据都是顺序排列的
查找第一个班,第二个学生
arr[0*3+1]
查找第三个班,第一个学生
arr[2*3+0]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include "stdafx.h"
void fun() { int arr[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };
}
int main(int argc, char* argv[]) { fun(); return 0;
}
|
int arr[x][y]
寻找第五个班,第六个学生
arr[4*y+5]

三维数组
int arr[x][y][z]
寻找第a个班,第b个组,第c个学生
arr[a-1][b-1][c-1]
arr[(a-1)*y*z + (b-1)*z + c-1]