内存动态分配

动态内存分配与数组

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<stdio.h>
#include<malloc.h>
int main()
{
int* score;//创建数组
int i;
int stu_num = 5;
int sum;
float ave;

/*--(数据类型*)malloc(sizeof(数据类型))--*/
score = (int*)malloc(stu_num * sizeof(int));

for (i = 0; i < stu_num; i++)
{
scanf("%d", &score[i]);
}

/*--score[i]可以表示为*(score+i)--*/
for (i = 0; i < stu_num; i++)
{
printf("%d ",score[i]);
}
printf("\n");
for (i = 0; i < stu_num; i++)
{
printf("%d ", *(score+i));//内存向下移若干个单元
}
return 0;
}

创建未知大小的数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*---创建未知大小数组---*/
int main()
{
int* score;
int stu_num;

scanf("%d", &stu_num);

score = (int*)malloc(stu_num * sizeof(int));

for (i = 0; i < stu_num; i++)
{
scanf("%d", &score[i]);
}
}

创建结构体数组

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
32
33
34
35
36
37
/*---malloc未知大小结构体---*/
#include<stdio.h>
#include<malloc.h>

/*--创建结构体--*/
struct STU
{
char id[20];
int maths;
int eng;
int chi;
};

int main()
{
struct STU* stu;//类似数组。结构体数组。数据类型 + * + 数组名

int num;//确定学生数量
scanf("%d", &num);

stu = (struct STU*)malloc(num * sizeof(struct STU));

for (int i = 0; i < num; i++)
{
//getchar();//防止输入缓冲区的'\n'导致跳过输入
gets(stu[i].id);
scanf("%d", &stu[i].maths);
scanf("%d", &stu[i].chi);
scanf("%d", &stu[i].eng);
}

for (int i = 0; i < num; i++)
{
printf("%s %d %d %d\n", stu[i].id , stu[i].maths, stu[i].chi, stu[i].eng);
}

}

理解gets()前面需要getchar()

理解为scanf会获取确认按钮'\n'之前的所有内容。

留下一个'\n'在输入缓冲区(stdin)中,会被gets获取到,而gets()会获取包括\n的所有字符。

free()

malloc函数在使用完之后没有将空间返还给系统。free函数可以将内存空间在下一次调用malloc函数之前重新分配。

使用方法:

1
2
3
4
5
6
7
8
int main()
{
float* p = (float*)malloc(sizeof(float));
*p = 3.14;
printf("%g",*p);
free(p);
return 0;
}