C-缓冲区溢出与多维数组

缓冲区溢出

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};//数组长度为5,最大下标为4

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;

}

image-20231107102749694

多维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void fun()
{
/*int arr[3][3]={
{1,2,3},
{4,5,6},
{7,8,9}
};*/

int arr[12]={1,2,3,4,5,6,7,8,9};
//多余的空间编译器补0


}

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

}

image-20231107103007562

从内存分配上数组没有本质区别,编译器会根据两个中括号相乘的大小分配总空间,多维数组的分配可以简写

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]

image-20231107103209008

三维数组

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]